11.2.4. トランザクションのタイムアウト
EJB などの管理環境で提供する極めて重要な特徴の1つは、トランザクションのタイムアウトです。これは管理されていないコードには提供できません。トランザクションタイムアウトにより、不正なトランザクションがユーザーにレスポンスを返さないまま、無期限にリソースを使い続けないようにします。管理環境 (JTA) の外では、Hibernate はこの機能をフルに提供できません。しかしながら、 Hibernate は次のようなデータアクセス操作の制御くらいはできます。データベースレベルのデッドロックや大きなリザルトセットを返すクエリを定義されたタイムアウトによって確実に制限します。管理された環境では、 Hibernate はトランザクションタイムアウトを JTA に委譲します。この機能は、Hibernate の
Transaction オブジェクトによって抽象化されています。
Session sess = factory.openSession();
try {
//set transaction timeout to 3 seconds
sess.getTransaction().setTimeout(3);
sess.getTransaction().begin();
// do some work
...
sess.getTransaction().commit();
}
catch (RuntimeException e) {
sess.getTransaction().rollback();
throw e; // or display error message
}
finally {
sess.close();
}
CMT Bean の中では
setTimeout() を呼び出せないことに注意してください。トランザクションタイムアウトは宣言的に定義しなければなりません。