NHibernate でトランザクションを使用する場合は、Session.Flush() の使用を避け、代わりに内部で session.flush() を呼び出す transaction.Commit() を使用してください。
Commit() 中にエラーが発生し、トランザクションをロールバックする必要がある場合は、次のように対処できます。
public static void CommitChanges()
{
ITransaction transaction = Session.BeginTransaction();
try
{
transaction.Commit();
}
catch (HibernateException ex)
{
transaction.Rollback();
//close and dispose session here
throw ex;
}
finally
{
transaction.Dispose();
}
}
現在、flush() の手動呼び出しまたは commit() の呼び出しが成功した場合、NHibernate メカニズムを使用してトランザクションをロールバックする方法はありません。特に transaction.Commit() コマンドを呼び出すと、NHibernate によって作成された AdoTransaction は Commit() が終了した直後に破棄されるため、ロールバックするためにアクセスすることはできません。
上記のコード サンプルを使用すると、コミット中に発生したエラーをキャッチして、既に開始されているトランザクションをロールバックできます。
上記のサンプルで transaction.Commit() を呼び出す代わりに、私のテストで session.Flush() を呼び出します。トランザクションは決してコミットされないため、データはデータベースに保存されません。
コードがどのように見えるかはわかりませんが、上記のコードサンプルが示すように、パターンで呼び出している場合、Session.Flush() の代わりに transaction.commit() を使用すると、目的を達成する方法が得られるはずです。欲しいです。