9 Stimmen

NServiceBus und NHibernate - Message Handler und Transaktionen

Von meinem Verständnis NServiceBus führt die Handle-Methode eines IMessageHandlers innerhalb einer Transaktion, wenn eine Ausnahme aus dieser Methode propagiert, dann NServiceBus wird sicherstellen, dass die Nachricht zurück auf die Message-Queue (bis X Menge von Zeiten vor Fehler-Warteschlange) usw. gesetzt wird. so haben wir eine atomare Operation sozusagen.

Nun, wenn ich innerhalb meiner NServiceBus Message Handle-Methode ich etwas wie dieses tun

using(var trans = session.BeginTransaction())
{ 

  person.Age = 10;
  session.Update<Person>(person);
  trans.Commit()
}

using(var trans2 = session.BeginTransaction())
{ 

  person.Age = 20;
  session.Update<Person>(person);
  // throw new ApplicationException("Oh no");
  trans2.Commit()
}

Welche Auswirkungen hat dies auf den Umfang der Transaktion? Wird trans1 nun als verschachtelte Transaktion in Bezug auf ihre Beziehung zur Nservicebus-Transaktion gezählt, obwohl wir nichts getan haben, um sie miteinander zu verbinden? (Wenn nicht, wie würde man sich mit der Transaktion von NServiceBus verbinden?

Wenn ich den zweiten Block (trans2) betrachte und die throw-Anweisung entferne, wird die NServiceBus-Transaktion dann auch trans1 zurücksetzen? In grundlegenden Szenarien, sagen wir, ich dump die oben in eine Konsole app, dann trans1 ist unabhängig, Commit, gespült und wird nicht rollback. Ich versuche zu klären, was passiert jetzt wir sitzen in jemand anderes Transaktion wie NServiceBus?

Das oben genannte ist nur Beispielcode, im wouldnt arbeiten direkt mit Sitzung, mehr wie durch eine uow-Muster.

7voto

Udi Dahan Punkte 11642

Wenn Sie Ihren Endpunkt als Transaktion markieren (.MsmqTransport().IsTransactional(true) oder einfach AsA_Server), dann werden die Transaktionen in den einen geöffneten NServiceBus eintreten. Das bedeutet, dass die Commits, die Sie in Ihrem Handler haben, nicht wirklich passieren werden und das Ganze wird entweder Commit oder Rollback zusammen - es sei denn, Sie sagen Ihren Transaktionen ausdrücklich, dass sie nicht in die umgebende Transaktion eintreten sollen.

Unabhängig davon, ob Sie direkt mit der Sitzung oder über eine UoW arbeiten, sieht es so aus, als ob Sie für eine bestimmte Nachricht mehr als eine machen wollen - warum? Die Nachricht ist bereits die natürliche UoW.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X