簡単に言うと:
- 常にトランザクションを使用する
- を使用しないでください。代わりに、ステートメント内で
Close()
呼び出しをラップするか、ISession のライフサイクルを別の場所で管理してください。ISession
using
ドキュメントから:
ISession
は、ADO.NET 接続の状態をメモリに保持されているオブジェクトの状態と同期するために必要な SQL ステートメントを時々実行します。このプロセスであるフラッシュは、デフォルトで次の時点で発生します。
Find()
orのいくつかの呼び出しからEnumerable()
- から
NHibernate.ITransaction.Commit()
- から
ISession.Flush()
SQL ステートメントは、次の順序で発行されます。
- を使用して対応するオブジェクトが保存されたのと同じ順序で、すべてのエンティティの挿入
ISession.Save()
- すべてのエンティティの更新
- すべてのコレクションの削除
- すべてのコレクション要素の削除、更新、および挿入
- すべてのコレクションの挿入
- すべてのエンティティの削除。対応するオブジェクトが削除されたのと同じ順序で
ISession.Delete()
(例外は、ネイティブ ID 生成を使用するオブジェクトが保存時に挿入されることです。)
明示的な場合を除いてFlush()
、セッションが ADO.NET 呼び出しを実行するタイミングについてはまったく保証されず、それらが実行される順序のみが保証されます。ただし、NHibernate はISession.Find(..)
メソッドが古いデータを返さないことを保証します。また、間違ったデータを返すこともありません。
デフォルトの動作を変更して、フラッシュの発生頻度を下げることができます。クラスは 3 つのFlushMode
異なるモードを定義します: コミット時にのみフラッシュする (および NHibernate ITransaction
API が使用されている場合のみ)、説明されたルーチンを使用して自動的にフラッシュする、Flush()
明示的に呼び出されない限りフラッシュしない。ISession
最後のモードは、 が長時間開いたまま切断されたままになる、長時間実行される作業単位に役立ちます。
...
このセクションも参照してください。
セッションの終了には、次の 4 つの段階があります。
- セッションをフラッシュする
- トランザクションをコミットする
- セッションを閉じる
- 例外を処理する
セッションのフラッシュ
APIを使用している場合ITransaction
は、この手順について心配する必要はありません。トランザクションがコミットされると暗黙的に実行されます。それ以外の場合は、呼び出しISession.Flush()
て、すべての変更がデータベースと同期されていることを確認する必要があります。
データベース トランザクションのコミット
NHibernate ITransaction API を使用している場合、これは次のようになります。
tx.Commit(); // flush the session and commit the transaction
ADO.NET トランザクションを自分で管理している場合はCommit()
、ADO.NET トランザクションを手動で行う必要があります。
sess.Flush();
currentTransaction.Commit();
変更をコミットしない場合:
tx.Rollback(); // rollback the transaction
また:
currentTransaction.Rollback();
トランザクションをロールバックする場合は、NHibernate の内部状態が一貫していることを確認するために、現在のセッションをすぐに閉じて破棄する必要があります。
ISession を閉じる
への呼び出しISession.Close()
は、セッションの終了をマークします。Close() の主な意味は、ADO.NET 接続がセッションによって放棄されることです。
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
独自の接続を提供した場合はClose()
、それへの参照が返されるため、手動で接続を閉じるか、プールに返すことができます。それ以外の場合Close()
は、それをプールに返します。