4.1 Hibernate でのトランザクションの概要
上記すべてに、取引に関する情報を追加したいと思います。すでにご存知のとおり、トランザクションは、すべて同時に実行する必要があるアクションのグループです。いずれかのアクションが失敗した場合、またはエラーで実行された場合は、他のすべてのアクションをキャンセルする必要があります。
Hibernate は 2 種類のトランザクションを処理できます。
- JDBC
- JTA
JDBC トランザクションは実際にはデータベース トランザクションです。これは、データベースの操作や JDBC 接続に関連付けられています。そして、データベースを操作するときのアクションが、すべてまたは何も実行されずに、正しく実行されることを確認します。
JTA - トランザクションはアプリケーション レベルのトランザクションです。どのデータベースにも関連付けられていません。そのタスクは、特定のアクションがすべて実行されるか何も実行されないかを確認することです。
たとえば、単一の JTA トランザクション内で複数の異なるデータベースにデータを書き込むことができます。その後、エラーが発生した場合、JTA トランザクションはすべてのデータベースの変更をロールバックする必要があります。特定のデータベースに関しては正常に実行されたものも含まれます。
4.2 Hibernate トランザクション インターフェイス
Hibernate ライブラリでは、トランザクションは Transaction インターフェイスによって表され、さまざまな実装を持つことができます。たとえば、Spring を使用する場合、Spring は独自の JTA トランザクション メカニズムを提供します。
このインターフェースのメソッドは次のとおりです。
# | 方法 | 説明 |
---|---|---|
1 | 始める() | 新しいトランザクションを開始します |
2 | 専念() | トランザクションを終了し、すべての変更をプッシュ/コミットします |
3 | ロールバック() | 現在のトランザクションをロールバックします |
4 | setTimeout(int 秒) | トランザクションの最大実行時間を設定します。 |
5 | アクティブです() | トランザクションがアクティブかどうかを確認します |
6 | wasRolledBack() | トランザクションが正常にロールバックされたかどうかを確認します |
7 | コミットされました() | トランザクションが正常にコミットされたかどうかを確認します |
8 | registerSynchronization() | トランザクションを制御するコールバックを登録します |
重要!トランザクション オブジェクトの作成とトランザクションの開始は別のものです。ここで、Thread クラスと類似することができます。Thread() オブジェクトを作成するとき、JVM はまだ新しいスレッドを開始しません。これを開始するには、Thread オブジェクトの start() メソッドを呼び出す必要があります。トランザクションも同様で、begin() メソッドを呼び出す必要があります。
Hibernate でトランザクションが通常どのように処理されるかを示す例:
Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
transaction.begin();
Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
transaction.commit();
}
catch (Exception e) {
if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
transaction.rollback();
}
}
finally {
session.close();
sessionFactory.close();
}
ここで 3 つのことがわかります。
まず、データベースでのすべての作業は、メソッドの呼び出しによってトランザクションにラップされますbegin()
。commit()
これら 2 つのメソッドの呼び出し間のすべてのアクションは、すべて同時に実行するか、何も実行しないかのいずれかで実行する必要があります。
次に、エラーが発生した場合は、トランザクションのロールバックを試みます。つまり、 を呼び出しますrollback()
。begin()
これは、TransactionManger がまずと の間にあったすべてのアクションを記録しcommit()
、次に を呼び出した場合にすべてをそのまま返す必要があることを意味しますrollback()
。
ちなみに、ロールバック メソッドを呼び出すときにエラーが発生しないというわけではありません。間違いは必ず起こります。この事実を受け入れ、それに備える必要があるだけです。
4.3 トランザクションマネージャー
トランザクション管理の観点から見ると、Hibernate は JDBC の軽量のオブジェクト ラッパーにすぎません。Hibernate 自体にはトランザクション処理機能がありません。Hibernate トランザクションは実際には、基礎となる JDBC トランザクションのラッパー (または JTA トランザクション ラッパー) です。JDBCTransaction がデフォルトです。Hiberante 設定ファイルの例:
hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
トランザクションを使用してコードをもう一度見てみましょう。
Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();
次に、JDBCTransaction クラスのコードを見てみましょう。
public class JDBCTransaction implements Transaction {
public void begin() throws HibernateException {
...
if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
...
}
}
トランザクションを開始するメソッドです。次に、send メソッドを見てみましょう。
public void commit() throws HibernateException {
...
jdbcContext.connection().commit();
...
jdbcContext.connection().setAutoCommit( true );
...
}
次に、このコードを Hibernate のサンプル コードに置き換えてみましょう。
休止状態 | 単純な JDBC コード |
---|---|
|
|
したがって、ネイティブ Hibernate トランザクションは、データベースに対するネイティブ JDBC 呼び出しにすぎません。それ以上でもそれ以下でもありません。しかし、JTAの取引はもっと興味深いものです。しかし、それについてはまた別の機会に。
GO TO FULL VERSION