第11章 トランザクションと並行性

第11章 トランザクションと並行性

11.1. session スコープと transaction スコープ
11.1.1. 作業単位(Unit of work)
11.1.2. 長い対話
11.1.3. オブジェクト識別子を考える
11.1.4. 一般的な問題
11.2. データベーストランザクション境界
11.2.1. 管理されていない環境
11.2.2. JTA を使用する
11.2.3. 例外ハンドリング
11.2.4. トランザクションのタイムアウト
11.3. 楽観的同時実行制御
11.3.1. アプリケーションによるバージョンチェック
11.3.2. 拡張セッションと自動バージョニング
11.3.3. デタッチされたオブジェクトと自動バージョニング
11.3.4. 自動バージョニングのカスタマイズ
11.4. 悲観的ロック
11.5. コネクション開放モード

Hibernate と同時実行制御について最も重要な点は、容易に理解できることです。 Hibernate は新たなロックの振る舞いを追加しておらず、直接 JDBC コネクションと JTA リソースを使用します。 JDBC 、 ANSI 、およびデータベース管理システム(DBMS)のトランザクション分離の仕様を少し時間をかけて勉強することを強く推奨します。

Hibernate はメモリ内のオブジェクトをロックしません。アプリケーションは、データベーストランザクションの分離レベルで定義した振る舞いを期待できます。トランザクションスコープのキャッシュでもある Session のお陰で、識別子やクエリにより検索したエンティティはリピータブルリードになります(スカラー値を返すようなレポートクエリは違います)。

バージョニングによる自動的な楽観的同時実行制御に加えて、 SELECT FOR UPDATE 文を使用して、行を悲観的ロックするための(マイナーな) API も提供します。楽観的同時実行制御とこの API については、この章の後のほうで議論します。

データベーストランザクションや長い対話(conversation、ロングトランザクション)だけでなく、 ConfigurationSessionFactory、および Session という粒度で Hibernate が行う同時実行制御の議論を始めます。