2009-06-04 5 views
2

ich ein dotnet applicaton haben, die eine Reihe von Einsatz ausführt, zu aktualisieren, löschen Aussagen in transactionaly WeiseFührt Sql einen impliziten Rollback durch, wenn mein Rollback-Timeout auftritt?

Der Code ist wie dieser

try 
{ 
mytrans = mycon.begintransaction(); 
//execute sql statements 
mytrans.commit(); 
} 
catch(Exception) 
{ 
mytrans.rollback(); 
} 

Das Problem, dass manchmal wir Timeout Ausnahmen in Rollback konfrontiert und ich festgestellt, dass die Datenbankgröße (MDF-Datei) erhöht wurde !!! Also bedeutet es Sql wird nicht implizit Rollback machen? Wenn ja, wie kann ich mich von diesem Fehler erholen und in den ursprünglichen Zustand wechseln ???

Antwort

2

Das grundlegende Konzept von Transaktionen erfordert, dass Transaktionen, die nicht festgeschrieben sind, den Zustand der Datenbank nicht beeinflussen.

Dateigröße bedeutet nichts. RDBMS-Datenstrukturen sind weitaus komplexer als das einfache Hinzufügen einer Zeile zu einer Datei - sie enthalten Protokolle und Indizes, so dass die Datei unabhängig von der Datenmenge in der Datenbank wachsen und schrumpfen kann.

+0

Es bedeutet also, dass die Transaktion, die nicht commited ist implizit rollback, oder? falls ja Was ist das Ziel der Rollback-Methode? –

+0

Ja, eine Transaktion, die nicht festgeschrieben ist, wird implizit zurückgesetzt, wenn die DB-Verbindung geschlossen wird (möglicherweise durch ein Timeout). Der Sinn der Rollback-Methode liegt darin, Ihrem Programm die Kontrolle darüber zu geben, da es Situationen geben kann, in denen ein Rollback nicht durch technische Probleme verursacht wird, sondern durch Programmlogik, dh das Programm startet eine Transaktion, macht ein paar Sachen und entscheidet sich dann für ein Rollback die Transaktion und tun Sie etwas anderes stattdessen mit der gleichen DB-Verbindungc. –

+0

Ok, aber meine Logik sagt zuerst Ich verschiebe aktuelle Tabellen zu historical Tabellen und dann einige Verarbeitung während dieser Verschiebung ich konfrontiert primäre Schlüsselverletzung Ausnahme, so dass die Programme versucht Rollback und Timeout Ausnahme aufgetreten ist, nachdem ich festgestellt, dass es redundante Werte gibt in spezifische historische Tabelle !!! das bedeutet, dass der sql nicht zurückgesetzt werden konnte (denke ich) –

1

Alle SQL-Anweisungen, die möglicherweise ausgeführt wurden, wurden noch nicht festgeschrieben. Wenn Ihr Rollback aus irgendeinem Grund Timeouts ist, die nicht zu einem Commit führen. Daher wird die DB schließlich ihre gesamte Birnenform erkennen und die Änderungen verwerfen.

Eine Erhöhung der MDF-Größe ist kein Hinweis darauf, dass die Transaktion festgeschrieben wurde. Die Ergebnisse der Transaktion müssen jedoch irgendwo hingelegt werden. Das Commit der Transaktion sollte die geringste Änderung in der DB erfordern. Daher können Seiten zugewiesen und Daten geschrieben werden und dann beim Commit werden nur ein paar andere Bits optimiert, die an den richtigen Stellen zeigen.

Bei einem Rollback werden die letzten paar Bits nicht optimiert und die zugewiesenen Seiten werden einfach zu freien Seiten für andere Dinge. Sie können nicht erwarten, dass die Datenbank erneut verkleinert wird.

0

Sobald ein Rollback es muss vollständig gestartet wurde. Ob Sie noch verbunden sind oder nicht, SQL Server wird den Rollback trotzdem abschließen. Wenn Sie einen Rollback nicht abschließen, bleibt Ihre Datenbank korrupt und muss wiederhergestellt werden.

Verwandte Themen