Frage

Ich weiß, dass nhibernate doesnt unterstützen Transaktionen verschachtelt.

Lassen Sie uns sagen, dass ich so etwas wie dieses bekam:

  1. UserService.BeginTransaction (auf aktuelle Sitzung)
  2. UserService.Save
  3. UserService-> Feedservice
    1. FeedService.BeginTransaction (auf aktuelle Sitzung)
    2. FeedService.Save
    3. FeedService.Commit (auf der zurückgegebenen Transaktion in # 3.1)
  4. UserService-> AddressService
    1. AddressService.BeginTransaction (auf aktuelle Sitzung)
    2. AddressService.Save
    3. AddressService.Commit (auf der zurückgegebenen Transaktion in # 4.1)
  5. 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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top