0

Ich verwende NHibernate 3. Meine Anwendung funktioniert gut, wenn mit SQL Server 2008 ausgeführt wird, aber zeitweise Fehler in SQL 2000 (wir haben den NH-Dialekt entsprechend geändert). Die Fehler beziehen sich alle auf die MDTC-Komponente (verteilte Transaktion). In der Regel funktioniert das Lesen in Ordnung, aber der Code explodiert beim Speichern/Aktualisieren, aber nicht immer mit dem gleichen Fehler. Eine, die wir oft gesehen haben, ist 'Verteilte Transaktion abgeschlossen. Führen Sie diese Sitzung entweder in einer neuen Transaktion oder in der NULL-Transaktion ein.Warum sollte es keine aktive Transaktion im NHibernate IPreUpdateEventListener/IPreInsertEventListener geben?

Ich untersuche die Ursachen dafür und habe etwas Protokollierung hinzugefügt. Ich habe IPreUpdateEventListener und IPreInsertEventListener Interceptors definiert, also logge ich mich dort und in meinem Repository ein. Was ich finde, ist, dass es zu der Zeit, wenn ich zu meinem Hörer komme, keine Transaktion in der aktuellen Sitzung gibt.

Hier ist mein Repository Code:

public virtual void Save(object entity) 
{ 
    logger.DebugFormat("Opening transaction to save entity type {0}.", entity.GetType().Name); 

    using (var t = new TransactionScope()) 
    { 
     GetSession().SaveOrUpdate(entity); 
     logger.DebugFormat("Committing transaction."); 
     t.Complete(); 
    } 
} 

Und hier ist mein Event-Listener-Code:

logger.DebugFormat("Save/Insert entity. Transaction.Active = {0}", 
    persister.Factory.GetCurrentSession().Transaction != null 
    ? persister.Factory.GetCurrentSession().Transaction.IsActive.ToString() 
    : "no transaction"); 

Und hier ist die Log-Ausgabe:

2011-01-14 17:23:13,549 [9] DEBUG BaseRepository`1.Save - Opening transaction to save entity type XXXXXXX. 
2011-01-14 17:23:13,566 [9] DEBUG BaseRepository`1.Save - Committing transaction. 
2011-01-14 17:23:13,598 [9] DEBUG AuditEventListener.Audit - Save/Insert entity. Transaction.Active = False 

Können Sie etwas sehen falsch damit? Warum ist im Pre-Insert keine Transaktion aktiv? Weiß jemand etwas Besonderes, das ich für Sql Server 2000 tun muss (MSDTC ist eingeschaltet)?

Beachten Sie, dass die 2008-Umgebung meinem lokalen Rechner läuft Windows 7 und SQL Server 2000-Server Server 2003

Antwort

3

Transaction hat nicht erstellen NHibernate Transaktion.

Sie müssen es explizit erstellen, mit session.BeginTransaction(). Es wird automatisch in die verteilte Transaktion eingetragen (vergessen Sie nicht, Commit() es vor Complete)

+1

Vielen Dank. Das war ich müde und das nicht zu sehen. Ich wechselte zur Verwendung von NH-Transaktionen und wir hatten einen ähnlichen, aber damit verbundenen Fehler und Transaction.Active war immer noch falsch im Event-Listener, obwohl wir eine Session gemacht hatten.BeginTransaction(). Dies tritt nur auf, wenn sich die Anwendung auf einem anderen Computer als der Sql-Server befindet, also gehe ich davon aus, dass es sich um ein Netzwerk/eine Erlaubnis handelt. –