HardCode
HardCode

Reputation: 2025

When to call NHibernate Rollback?

I'm using NHibernate to insert some data into Table A. I want to update the status in Table B if the Table A transaction fails. How do I check if it has failed?

Below is my current code:

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

Where do I call the NHibernate Transaction? If it fails where do I call NHibernate Rollback and update the Table B status?

Upvotes: 1

Views: 7083

Answers (2)

GSerjo
GSerjo

Reputation: 4778

using (ISession session = factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
    // do some work
    tx.Commit();
}

or manually

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

Take a look NHibernate transactions for more details

Upvotes: 2

Randy Burden
Randy Burden

Reputation: 2661

Take a look at the Official NHibernate documentation on Exception handling: 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();
        }
    }
}

From what I remember, you don't actually have to call tx.Rollback() because when your code leaves the using blocks, it will do that automatically but again, I can't remember exactly. Give it a try and if it doesn't behave as I just described, you can manually rollback in the catch.

Upvotes: 6

Related Questions