nhibernate and nested transactions

2.2k views Asked by At

I know that nhibernate doesnt support nested transactions.

Let's say that I got something like this:

  1. UserService.BeginTransaction (on current session)
  2. UserService.Save
  3. UserService->FeedService
    1. FeedService.BeginTransaction (on current session)
    2. FeedService.Save
    3. FeedService.Commit (on the returned transaction in #3.1)
  4. UserService->AddressService
    1. AddressService.BeginTransaction (on current session)
    2. AddressService.Save
    3. AddressService.Commit (on the returned transaction in #4.1)
  5. UserService.Commit (on the returned transaction in #1)

What happens when commit is invoked in #3.3, is the transaction commited? I need everything to either succeed or fail.

2

There are 2 answers

2
Diego Mijelshon On BEST ANSWER

As Jamie said, transactions should be managed at a higher level to avoid this situation.

However, if you must keep the begin/commit at the "Service" level for whatever reason, you could wrap everything in a TransactionScope, which you'll Complete() only after everything suceeds.

1
Jamie Ide On

Yes. The BeginTransaction call in 3.1 won't do anything because there is already an active transaction. If you want all of your operations to participate in the same transaction then don't call Begin/End Transaction in 3.x and 4.x.

My advice is to not use transactions in service or repository classes. I either control the transaction at the UI level or create a class that encapsulates the business process.