2016-04-20 4 views
0

Ist die Dokumentation Zitat aus dieser Antwort: https://stackoverflow.com/a/542691/1011724Does LINQ2SQL setzen ExecuteCommand automatisch in einer Transaktion

Wenn Sie SubmitChanges rufen, LINQ to SQL überprüft, ob der Anruf im Rahmen einer Transaktion ist oder wenn die Die Transaktionseigenschaft (IDbTransaction) ist auf eine vom Benutzer gestartete lokale Transaktion festgelegt. Wenn keine Transaktion gefunden wird, startet LINQ to SQL eine lokale Transaktion (IDbTransaction) und verwendet sie, um die generierten SQL-Befehle auszuführen. Wenn alle SQL-Befehle erfolgreich abgeschlossen wurden, schreibt LINQ to SQL die lokale Transaktion fest und gibt sie zurück.

gelten für die .ExecuteCommand() Methode? Mit anderen Worten, kann ich darauf vertrauen, dass das folgende Löschen in einer Transaktion behandelt wird und automatisch rückgängig gemacht wird, wenn es fehlschlägt oder muss ich es manuell mitteilen, eine Transaktion zu verwenden, und wenn ja, wie? Sollte ich TransactionScope verwenden?

using(var context = Domain.Instance.GetContext()) 
{ 
    context.ExecuteCommand("DELETE FROM MyTable WHERE MyDateField = {0}", myDate) 
} 
+0

Die using-Anweisung erstellt einen Ausnahmebehandler für das Programm nicht beendet und nach dem using-Block fortgesetzt. Es garantiert nicht, dass der gesamte Code in der using-Anweisung ausgeführt wird. Der GetContext kann zwei verschiedene Arten von Fehlern haben. 1) Verbindung zur Datenbank nicht möglich 2) Fehler beim Abrufen von Daten aus der Datenbank. Jetzt macht es Sinn, einen Löschvorgang durchzuführen, wenn Sie keine Verbindung zur Datenbank herstellen können. Nein. Ist es sinnvoll, aus einer Tabelle zu löschen, die keine Zeilen enthält, weil während der Abfrage eine Ausnahme aufgetreten ist, nein Sicher ist es notwendig, das Löschen in jedem Fall durchzuführen. – jdweng

+0

Meine Frage ist mehr von der DB-Seite - wird es transaktional sein? Entweder muss das gesamte Löschen erfolgen oder nichts muss gelöscht werden. Wenn also mitten in der Löschung ein Fehler auftritt, muss ich wissen, dass die DB in einen Zustand zurückgesetzt wird, bevor die Löschung gestartet wurde. Das frage ich. – Dan

+0

Es ist besser, als gespeicherte Prozedur in der Datenbank zu implementieren. Wenn Sie eine Abfrage hatten, die eine halbe Stunde dauerte und die Verbindung zwischen dem Client und dem Server unterbrochen wurde, trat das Löschen in der Mitte der Abfrage nicht auf. Es kann besser sein, Code als gespeicherte Prozedur in der Datenbank zu verwenden als in C#. Ich kenne nicht alle Voraussetzungen, um eine bessere Antwort zu geben. – jdweng

Antwort

2

Jede SQL-Anweisung, auch nicht in einer expliziten Transaktion gehüllt, tritt transaktions. Also, explizite Transaktion oder nicht, einzelne Aussagen sind immer atomare - sie passieren entweder ganz oder gar nicht. Im obigen Beispiel werden entweder alle Zeilen gelöscht, die dem Kriterium entsprechen, oder keine - das ist unabhängig davon, was der Client-Code tut. Es gibt buchstäblich keine Möglichkeit, SQL Server dazu zu bringen, die Zeilen teilweise zu löschen. Selbst wenn Sie das Netzkabel herausziehen, bedeutet dies einfach, dass alles, was bereits für das Löschen getan wurde, rückgängig gemacht wird, wenn der Server neu startet und das Transaktionslog liest.

Die einzige Fliege in der Suppe ist, dass die Zeilen übereinstimmen kann variieren je nachdem, wie die Anweisung sperrt. Die Aussage erfolgt logisch in zwei Phasen, die erste, um festzustellen, welche Zeilen gelöscht werden und die zweite, um sie tatsächlich zu löschen (während einer Update-Sperre). Wenn Sie beispielsweise diese Anweisung ausgeben und während der Ausführung eine ausgegebene Zeile mit dem Kriterium DELETE ausgegeben haben, hängt es davon ab, für welche Transaktionsisolationsstufe es gilt, ob die Zeile in der Datenbank gespeichert ist oder nicht, nachdem die DELETE beendet wurde die Aussagen. Also, wenn Sie wollen praktische Garantien über "alle Zeilen" gelöscht werden, was Client-Code kommt in den Geltungsbereich. Dies geht jedoch etwas über den Rahmen der ursprünglichen Frage hinaus.

+0

Was ist, wenn Ihr Befehl gesendet wurde Multi-Anweisungen? Funktioniert ExecuteCommand eine Transaktion? – Terry

Verwandte Themen