2009-04-27 10 views
3

Etwas sehr seltsam ist hier los.TransactionScope Timeout Seltsamkeit mit TransactionScopeOption.RequiresNew

Ich habe gerade einen Transaktionsbereich um irgendeinen Legacy-Code hinzugefügt, den ich debuggte, um sicherzustellen, dass das Tüfteln, das ich tat, nicht begangen wurde.

dies zweimal gearbeitet, wobei dann gilt:

"The transaction manager has disabled its support for remote/network transactions." 

ohne Code-Änderungen oder neu erstellt zwischen der Arbeits/nonworkingness (wörtlich 3 F5s in einer Reihe [Web app]). Dies war lokaler Code, der sich mit einem entfernten DB-Server verbindet.

Da ist, völlig separaten Code in einem anderen Projekt Zeitablauf. Wenn ich die transactionScopes aus diesem Code entferne, läuft es gut, aber mit ihnen an Ort und Stelle es Timeout. Ich habe versucht, meinen lokalen SQL-Server und remote, beide Timeout im transactionScope.

Was zum Teufel ist los? bedeuten s

Was bedeutet dies:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 

zu

using (var scope = new TransactionScope()) 

das Problem verhindert

:

Edit: Ich habe, dass meine TransactionScopes ändert gefunden?

+0

Können Sie uns zeigen Sie den Code bitte ... –

+0

nicht leicht, im ein einfaches Beispiel zu erstellen versuchen, es zu reproduzieren. bleiben Sie dran –

Antwort

0

Ich glaube, was passiert, wenn der Fehler auftritt, ist, dass das Framework versucht, die ursprüngliche "leichte" (d. H. DBMS) Transaktion zu einer "verteilten" Transaktion zu fördern. Der MSDTC-Dienst (Distributed Transaction Coordinator), der verteilte Transaktionen verwaltet, wird entweder nicht ausgeführt oder kann nicht arbeiten.

Dies geschieht normalerweise, wenn eine logische Transaktion zwei (oder mehr) Datenbankverbindungen umfasst. In Ihrem Fall gibt es (scheinbar) nur eine DBMS-Verbindung. Ich schätze, indem Sie einen neuen, unabhängigen Transaktionsbereich erzwingen, zwingen Sie das Framework auch dazu, eine verteilte Transaktion zu verwenden.

+0

dieser Typ hat ein sehr ähnliches Problem, wenn das Licht mehr Licht wirft http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic62511.aspx –

3

Der Unterschied zwischen:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 

und

using (var scope = new TransactionScope()) 

Ist das der zweite die bestehenden (Umgebungs-) Transaktion wiederzuverwenden, während die erste, eine neue Transaktion innerhalb einer alten schafft.

Diese Transaktion innerhalb einer Transaktion erfordert den Distributed Transaction Coordinator.

Es gibt dann drei wahrscheinliche Gründe für Ihre Fehler:

  • der MSDTC ist nicht
  • Ihre Datenbank auf einem anderen Computer ausgeführt wird und Windows konfiguriert ist, keine Transaktionen aus dem Netzwerk zu ermöglichen.
  • Ihre Datenbank ist auf einer andere Maschine und SQL-Server konfiguriert ist keine Transaktionen aus dem Netzwerk
+1

+1 für das Hinweis darauf, dass " new TransactionScope() "entspricht" new TransactionScope (TransactionScopeOption.Required) "- es kann den Unterschied ausmachen. – Yoopergeek

0

Alte Frage zu ermöglichen, aber ich hatte das gleiche Problem, so hier die einfachen Informationen viel Art von Problemen zu beheben.

Wenn Sie TransactionScopeOption.RequiresNew-TransactionScopeOption.RequiredScheck ändern können, wenn Sie wirklich explizit müssen, um das Verhalten für verschachtelte Transaktionen und betrachten durch das Lesen this MSDN article ausdrücklich die Art der Transaktion Bereich festgelegt. Wahrscheinlich war Ihr Problem die Anzahl neuer Transaktionen mit gesperrten Ressourcen, weshalb das Problem "komisch" war.

Zusätzlich sollten Sie diese Informationen überprüfen:

The default transaction scope is considered harmful

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 

Sie standardmäßig eingestellt:

  1. Isolation als Serializable (man denke mit IsolationLevel.ReadCommitted)
  2. TimeOut einem Minute (in Betracht ziehen,zu verwenden)

Mit diesen beiden Optionen und der TransactionScopeOption.RequiresNew sollten Sie Deadlocks erwarten.

Hier neuen Code:

new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions 
    { 
     IsolationLevel = IsolationLevel.ReadCommitted, 
     Timeout = TransactionManager.MaximumTimeout 
    } 
)