I know that nhibernate doesnt support nested transactions.
Let's say that I got something like this:
- UserService.BeginTransaction (on current session)
- UserService.Save
- UserService->FeedService
- FeedService.BeginTransaction (on current session)
- FeedService.Save
- FeedService.Commit (on the returned transaction in #3.1)
- UserService->AddressService
- AddressService.BeginTransaction (on current session)
- AddressService开发者_JS百科.Save
- AddressService.Commit (on the returned transaction in #4.1)
- 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.
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.
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.
精彩评论