2009-05-07 2 views
0

Ich habe eine NHibernate-Transaktion, die etwas Arbeit und ruft eine Legacy-Methode, die DBTransactions verwendet, um mehrere Stored Procedures aufzurufen. Wenn einer dieser Legacy-Methodenaufrufe fehlschlägt, sollte die NHibernate-Transaktion zurückgesetzt werden.NHiberate verschachtelte Transaktion blockiert

Das Problem besteht darin, dass die Legacy-Methoden Daten in der Datenbank verwenden, die die NHibernate-Transaktion erstellt. Dies bewirkt, dass der SQL-Prozess des Legacy-Codes gesperrt wird, während auf den Nhibernate-Prozess gewartet wird. Der Nhibernate-Prozess wartet darauf, dass der Legacy-SQL-Prozess beendet wird, wodurch ein Deadlock verursacht wird.

Ich habe versucht, ReadUncommitted für beide Transaktionen, aber das funktioniert nicht.

Ich habe versucht, eine verteilte Transaktion einzurichten, indem ich System.EnterpriseServices wie im NHibernate in Action empfohlen, aber das scheint auch nicht zu funktionieren.

Ich bin nicht wirklich sicher, wo ich von hier aus gehen soll.

Antwort

1

Sie können eines der folgenden Dinge in der gewünschten Reihenfolge ausführen.

  1. Wenn Ihr NHibernate Arbeit an erster Stelle (in Bezug auf die Ausführungsreihenfolge), müssen Sie Ihre Legacy-Methoden verwenden, um Ihre NHibernate Datenbank-Verbindung machen. Die ISession stellt eine Connection-Eigenschaft zur Verfügung, die Sie an Ihren alten ADO-Code übergeben können.

  2. Oder umgekehrt, wenn das einfacher ist. Solange sie dieselbe Verbindung nutzen, können Sie beide Datenzugriffe im selben Transaktionskontext ausführen. Die ISessionFactory.OpenSession() hat eine Überladung, die IDbConnection-Instanz und dauert.

  3. eine Umgebungs implizite Transaktion starten, bevor Sie eine Legacy-Methoden starten oder NHibernate Methoden. Wenn Sie mit beiden Nhibernate und Legacy-Code abgeschlossen haben, können Sie sie beide zugleich begehen, indem er die Ambient-Transaktion abgeschlossen wird. (Ich setze nur dieses 3., weil es wahrscheinlich dauert länger als 1 oder 2 zu implementieren) Siehe MSDN für wie dies zu tun.

  4. Wenn Sie wirklich stecken und sind mit SQL Server können Sie dies tun, aber es ist wirklich böse. Sie können die zwei separaten Verbindungen in derselben Datenbanktransaktion zusammenführen. Ich kann noch keinen Link finden, wie es jetzt geht, also poste zurück, wenn du so verzweifelt bist, es zu versuchen!

+0

Vielen Dank für Ihre Hilfe. Ich ging mit Option 3 aufgrund der Art und Weise ist das System zur Zeit entwickelt. Ich habe TransactionScope anstelle von NHibernate oder ADO Transactions verwendet. Flush, bevor die Transaction beendet dann die Transaktion abgeschlossen. Nochmals vielen Dank für Ihre Hilfe. – Adam