1

テーブル A にデータを挿入するために NHibernate を使用しています。テーブル A のトランザクションが失敗した場合、テーブル B のステータスを更新したいと考えています。失敗したかどうかを確認するにはどうすればよいですか?

以下は私の現在のコードです:

// Add userId to Receiver
Receiver receiver = new Receiver();
receiver.User = User.GetById(Convert.ToInt32(listItem.Value));
receiver.Notification = Notification.GetById(notification.NotificationId);
receiver.Save();

NHibernate トランザクションはどこで呼び出せますか? 失敗した場合、どこで NHibernate Rollback を呼び出してテーブル B のステータスを更新すればよいですか?

4

2 に答える 2

6

例外処理に関する NHibernate の公式ドキュメントを参照してください: http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions

using ( ISession session = sessionFactory.OpenSession() )
{
    using ( ITransaction transaction = session.BeginTransaction() )
    {
        try
        {
            // Do your save/update here for Table A

            transaction.Commit();
        }
        catch( Exception e )
        {
            // Your save or update failed so this is where you
            // could capture that info and update your Table B

            transaction.Rollback();
        }
    }
}

私が覚えていることから、実際に tx.Rollback() を呼び出す必要はありません。これは、コードが using ブロックを離れると自動的に呼び出されるためですが、正確には思い出せません。試してみて、説明したとおりに動作しない場合は、キャッチで手動でロールバックできます。

于 2012-08-17T19:45:40.663 に答える
2
using (ISession session = factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
    // do some work
    tx.Commit();
}

または手動で

ISession session = factory.openSession();
try
{
   // do some work
   session.Flush();
   currentTransaction.Commit();
}
catch (Exception e)
{
   currentTransaction.Rollback();
   throw;
}
finally
{
   session.Close();
}

詳細については、 NHibernate トランザクションを参照してください。

于 2012-08-17T20:18:57.763 に答える