NHibernate und Transaktionen - "Transaktion nicht verbunden oder unterbrochen wurde"
Folgenden wird ein repräsentativer Ausschnitt aus meinem code, in dem eine unerwartete, zumindest für meinen Teil, Ausnahme wird geworfen auf die transaction.Rollback()
- Anweisung.
Ausnahme ist der Typ NHibernate.TransactionException
und die Nachricht ist "Transaktion nicht verbunden oder unterbrochen wurde." Und der StackTrace sieht wie folgt aus: NHibernate.Transaction.AdoTransaction.CheckNotZombied() at NHibernate.Transaction.AdoTransaction.Rollback()
.
IEmployeeService employeeService = new EmployeeService(session);
var people = ReadFromFile('c:\temp.csv');
for (var person in people)
{
ITransaction transaction = session.BeginTransaction();
try
{
employeeService.Update(person);
employeeService.CheckForRecursion();
transaction.Commit();
}
catch(Exception exp)
{
if (!transaction.WasRolledBack)
transaction.Rollback();
}
}
Den CheckForRecursion verwendet SQL, um sich für die Rekursion eingeführt durch das Letzte update, wenn ich also rückgängig machen wollen. Bei der Rekursion eingeführt wurde eine Ausnahme von Blasen von SQL, richtig so, und ich Fang es und versuchen Sie ein rollback. Das ist, wenn ich den Fehler Auftritt.
Ich gewickelt habe den rollback in einem try-catch, damit die ganze Sache weiter machen können, aber ich sehe die gleiche Ausnahme auf jeder nachfolgenden iteration der for-Schleife.
Ideen? Ist das Muster korrekt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum Sie nicht einfach entsorgen Sie die Transaktion?
Wenn eine Ausnahme Auftritt, sollten Sie zerstören die Sitzung. Die änderungen an der person, wo es nicht rückgängig gemacht. Wenn es nicht gelagert werden kann, ist es nicht gültig im Speicher.
Bekam ich diese Fehlermeldung, wenn ein trigger auf die Tabelle erhöht ein Fehler.
Ich befestigte den trigger und die Transaktion Fehler ging Weg.
Habe ich die NHibernate generierte SQL-Darstellung in der Ausgabe-Fenster, so nahm ich die Letzte generierte sql-Anweisung und lief in ein Abfrage-tool. Der trigger ausgelöst wird ein Fehler über das abschneiden von string-Werten.
Hier ist ein Beispiel einer Tabelle mit einem trigger, die dazu führen, diese Art von Fehler in NHibernate.