2

以下は私のコードの代表的なスニペットであり、少なくとも私の側では、予期しない例外がtransaction.Rollback()ステートメントでスローされています。

例外はタイプNHibernate.TransactionExceptionであり、メッセージは「トランザクションが接続されていないか、切断されました」です。そして、スタックトレースは次のようになりますNHibernate.Transaction.AdoTransaction.CheckNotZombied() at NHibernate.Transaction.AdoTransaction.Rollback()

IEmployeeService employeeService = new EmployeeService(session);
var people = ReadFromFile('c:\temp.csv');

for (var person in people)
{
    ITransaction transaction = session.BeginTransaction();
    try
    {
        employeeService.Update(person);

        employeeService.CheckForRecursion();

        transaction.Commit();
    }
    catch(Exception exp)
    {
        if (!transaction.WasRolledBack)
            transaction.Rollback();
    }
}

CheckForRecursionは、SQLを使用して、最後の更新で導入された再帰を探します。元に戻したい場合は。再帰が導入されると、SQLから例外が発生します。当然のことながら、それをキャッチしてロールバックを試みます。その時、私はエラーに遭遇します。

ロールバックをtrycatchでラップしたので、すべてを続行できますが、forループの後続の各反復で同じ例外が表示されます。

アイデア?このパターンは正しいですか?

4

2 に答える 2

1

取引を破棄してみませんか?

using (ITransaction transaction = session.BeginTransaction())
{
    employeeService.Update(person);

    employeeService.CheckForRecursion();

    transaction.Commit();
}

例外が発生した場合は、セッションを破棄する必要があります。人に加えられた変更は元に戻すことができません。格納できない場合は、メモリ上で有効ではありません。

于 2013-01-15T16:41:42.417 に答える