全て、
これは、n-hibernateセッションを使用してデータを読み書きするために使用されるパターンです。
using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
// all the code that uses the session goes here
// use session to load and/or save entity
}
私の質問は:
トランザクションを開始すると、接続でデータベーストランザクションが開始されますが、対応するcommitステートメントが表示されません。むしろ、txのusingステートメントがtx.Dispose()を呼び出します。(SqlTransactionオブジェクトを使用するAdoTransactionクラスからの)n-hibernateソースを見ると、基になるトランザクションオブジェクトはコミットされることはなく、以下に示すように破棄されます。それで、SqlTransactionプロバイダーが破棄する前にcommitを呼び出すと想定しますか?それはado.netのSqlClientプロバイダーのどこかのドキュメントですか?
if (isDisposing)
{
if (trans != null)
{
trans.Dispose();
trans = null;
log.Debug("IDbTransaction disposed.");
}
if (IsActive && session != null)
{
// Assume we are rolled back
AfterTransactionCompletion(false);
}
}
明らかに、tx.Dispose()が呼び出されたときにセッションをフラッシュするコードを見つけることができなかったため、何かが欠けています。