nhibernate und verschachtelte Transaktionen
-
04-10-2019 - |
Frage
Ich weiß, dass nhibernate doesnt unterstützen Transaktionen verschachtelt.
Lassen Sie uns sagen, dass ich so etwas wie dieses bekam:
- UserService.BeginTransaction (auf aktuelle Sitzung)
- UserService.Save
- UserService-> Feedservice
- FeedService.BeginTransaction (auf aktuelle Sitzung)
- FeedService.Save
- FeedService.Commit (auf der zurückgegebenen Transaktion in # 3.1)
- UserService-> AddressService
- AddressService.BeginTransaction (auf aktuelle Sitzung)
- AddressService.Save
- AddressService.Commit (auf der zurückgegebenen Transaktion in # 4.1)
- UserService.Commit (auf der zurückgegebenen Transaktion in # 1)
Was passiert, wenn commit in # 3.3 aufgerufen wird, wird die Transaktion verpflichtet? Ich muss alles entweder Erfolg oder Misserfolg.
Lösung
Wie Jamie sagte, sollen Transaktionen auf einer höheren Ebene verwaltet werden, um diese Situation zu vermeiden.
Wenn Sie jedoch müssen halten die beginnen / commit an der „Service“ Ebene für welchen Gründen auch immer, könnte man alles in einem TransactionScope
wickeln, die Sie erst nach alles suceeds Complete()
werden.
Andere Tipps
Ja. Der Begintrans Anruf in 3.1 wird nichts tun, weil es bereits eine aktive Transaktion ist. Wenn Sie alle Ihre Operationen wollen dann in der gleichen Transaktion teilnehmen nicht aufrufen Beginn / Ende der Transaktion in 3.x und 4.x.
Mein Rat ist, nicht Transaktionen in Dienst oder Repository-Klassen zu verwenden. Ich kontrolliere entweder die Transaktion auf UI-Ebene oder eine Klasse erstellen, die den Geschäftsprozess kapselt.