Frage

Ich versuche, eine Art von verschachtelten Transaktion Verhalten mit NHibernate Transaktionssteuerung zu erreichen und Flushmode Optionen, aber die Dinge bekam ein wenig nach zu viel Lesen verwirrend, so dass jede Bestätigung über die Fakten, die ich unten Liste sehr nützlich sein wird.

Was ich will, ist eine große Transaktion, dass Spaltungen in kleinen Transaktionen zu öffnen. Stellen Sie sich folgendes Szenario vor:

  • TX1 öffnet ein TX und fügt einen Rekord Person;
  • TX2 öffnet ein TX und aktualisiert den Namen dieser Person zu P2;
  • TX2 Commits;
  • TX3 öffnet ein TX und aktualisiert den Namen dieser Person bis P3;
  • TX3 Rollbacks;
  • TX1 Commits;

Ich möchte NH sehen die INSERT Senden und das TX2 UPDATE in die Datenbank nur zu ignorieren, was TX3, wie es zurückgesetzt wurde.

Ich hat versucht, Flushmode = Nie zu verwenden und Spülen nur die Sitzung nach dem richtigen Beginnt / Commits / Rollbacks hat gefordert, aber NH aktualisiert immer die Datenbank mit dem Endzustand des Objekts, unabhängig von Commits und Rollbacks. Ist das normal? Does NH ignoriert wirklich Transaktionssteuerung, wenn mit Flushmode = Nie arbeiten?

Ich habe auch versucht, Flushmode zu verwenden = Commit und die verschachtelten Transaktionen openning, aber ich entdecken, dass, da ADO.NET, die verschachtelten Transaktionen sind eigentlich immer die gleiche Transaktion.

Beachten Sie, dass ich nicht ein „alles oder nichts“ Verhalten zu erreichen versuchen. Ich suche mehr auf einen Sicherungspunkt Arbeitsweise. Gibt es eine Möglichkeit, dass die (Speicherpunkte) mit NH zu tun?

Vielen Dank im Voraus.

Filipe

War es hilfreich?

Lösung

Just tun, um diese Frage nicht für immer offen lassen, werde ich die Lösung veröffentlichen, dass wir angenommen haben.

Wir haben eine Arbeitseinheit wie Container, der das verschachtelte Transaktionsverhalten verwaltet. In Abhängigkeit von der Art der Behandlung, dass wir wollen, schafft es (oder nicht) neue Sitzungen. Durch Beispiel:

  • auf Fehler Weiter: wenn wir das auch wollen, wenn auf einem Transaktionsfehler die anderen Commits, die UOW Behälter verschiedene Sitzungen für jede „Transaktion“ verwendet und spült jeden tx am Ende seiner Arbeit;
  • Zurücksetzen auf Fehler: Wenn wir, dass auf einer Sitzung Rollbacks (wegen eines Fehlers oder eines Unternehmens Rollback) wollen, dass jeder andere Transaktion rückgängig gemacht wird, verwendet der UOW Behälter die gleiche Sitzung für alle verschachtelten Transaktionen und Rollback alle in das Ende.

Es ist wichtig zu sagen, dass die „Transaktion“, dass diese UOW manipuliert ist nicht direkt das NH (ADO.NET) Transaktion. Wir haben eine Abstraktion einer Transaktion erstellt, so dass die Manipulation Code „Stimmen“ wenn unsere Transaktion verpflichtet werden könnte, oder zurückgerollt, aber die eigentliche Aktion tritt nur am Ende von allem auf der Grundlage der ausgewählten Fehlerstrategie.

Wir wissen, dass diese Nutzung ist nicht sehr verbreitet und nur paßt auf bestimmte Szenarien (in unserem Fall ist es ein Integrationsszenario mit Stapelverarbeitung), also werde ich jetzt Postleitzahl. Wenn jemand denkt, dass diese Implementierung helfen können, bitte senden Sie mir eine Nachricht und ich werde froh sein, den Code zu teilen.

Grüße,

Filipe

Andere Tipps

NHibernate nicht verschachtelte Transaktionen unterstützen. Jede ISession kann höchstens eine aktive Transaktion hat. Ich bin sicher nicht das, was Sie; re versuchen, weil Szenario Ihrem Beispiel zu erreichen, macht keinen Sinn für mich. Begehen Transaktion 1 nach dem Einsatz würde die gleiche Wirkung hat.

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