業務
1、トランザクション:各種データのプログラムを実行するデータベース操作ユニット。
2、トランザクション特性:
- アトミック:データベーストランザクションは、一連の操作の実行の最小単位で分割することができません。
- 一貫性:同時に1つのトランザクションでの操作はどちらか成功するか、同時に失敗。
- 単離:他のトランザクションからの干渉を受けることなく、トランザクションを操作します。
- 永続性:トランザクションを提出した後、ロールバックすることはできません。
3、そのサービスの同時動作可能性のある問題:
- ダーティ読み取り:別のトランザクションを読むためのトランザクションが更新されましたが、データを提出していませんでした。
- 非反復可能読み取り:トランザクションは、中間データ更新操作を2回、別のトランザクションを読み込みます。
- マジック読書:2つの他のトランザクションの途中で挿入のトランザクションデータの読み出し動作。
4、トランザクション分離レベル:
- (非コミット読み取り)非コミット読み取り:汚れを読み取り、繰り返し不可の読み取り、およびファントム読み取りが起こります。
- 読むには(提出を読んで)コミット:回避のダーティ・リードが、非反復可能読み取りおよびファントム読み取りが発生する可能性があります。
- 反復可能読み取り(反復可能読み取り):避けダーティ・リードと繰り返し不可能読みますが、ファントムが発生する可能性があります読み込みます。
- 直列化(シリアライズ):回避のダーティリード、反復不能読み取りとファントム読み取りが、低並行処理は、ほとんど使用されません。
Hibernateのトランザクション管理
1、オープントランザクション:トランザクションsession.beginTransaction TS =();
2、ロールバックトランザクション:ts.rollBack();
3、コミットされていないトランザクション。:ts.commit();
4、構成されたトランザクション分離レベル:hibernate.cfgいます。 XML設定ファイル
- 1:READ UNCOMMITTED分離
- 2:コミット読取り分離
- 4:反復可能読み取り分離
- 8:Serializableの分離
<!--例:设置隔离级别为:Repeatable read isolation-->
<property name="hibernate.connection.isolation">4</property>
スレッドに結びついたセッション
1つの理由:トランザクションを保証することであるので、各操作プラストランザクション・マネージャは、意味をなさない場合は、1つは、データベースレイヤ処理DAOの具体的な動作であるため、トランザクションは、通常、サービス層に設けられています同時に複数の操作の成功または失敗。しかしながら、各操作トランザクションは、セッションオブジェクトで得られる各方法DAOトランザクション層を必要と同じセッションでなければなりません。
2、解決するために:同一のセッションオブジェクトを取得するために各メソッドのトランザクションDAO層を作る二つの慣行があります。
- 図1に示すように、層作成サービスセッションオブジェクトは、各トランザクション方法DAO層に渡されます。
- 図2に示すように、ThreadLocalの層に結合されたサービスセッションオブジェクトは、各メソッドのThreadLocal DAO層におけるセッション・オブジェクトから取得します。トランザクション内の各操作は同じスレッドであるので、これと同じになります。このスレッドのセッションオブジェクトにどこに行きます。
休止状態を解決するために3、 Hibernateは第二の方法を用いて、上記の問題を解決するが、Hibernateは底が単純にSessionFactoryのgetCurrentSession()メソッドを呼び出して、私たちはセッションオブジェクトをバインドするための良いされていることを非常に健全なフレームワークです。結合は良いセッションオブジェクトを取得することができます。しかし、そうすることもhibernate.cfg.xmlで設定されている前提が必要です。
Hibernate設定ファイルでは、セッション管理方法を指定するには、hibernate.current_session_context_class属性を持つ、次の方法で管理:
- スレッド:ローカルスレッドに結びついたのSessionオブジェクトのライフサイクル;
- JTA:クロスデータベースのトランザクション管理のためのJTAトランザクションのライフ・サイクル・バインディングとのセッション。
- 管理:HibernateはSessionオブジェクトのライフサイクルを管理するためのプログラムを委託。
<!--例:Session对象的生命周期与本地线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>