Wie von Nick und Martin erwähnt, hängt der mögliche Status Ihrer Abfrage davon ab, ob SQL Server über Ihren Netzwerkkabelzug informiert ist, bevor die Abfrage abgeschlossen wurde. Aus der Onlinedokumentation (obwohl ich es interessant finde, dass es für 2000 , 2005 , 2008 und 2008 R2 gleichwertige Themen gibt , jedoch nicht für 2012 oder 2014):
Wenn ein Fehler den erfolgreichen Abschluss einer Transaktion verhindert, setzt SQL Server die Transaktion automatisch zurück und gibt alle von der Transaktion gehaltenen Ressourcen frei. Wenn die Netzwerkverbindung des Clients zu einer Instanz des Datenbankmoduls unterbrochen ist, werden alle ausstehenden Transaktionen für die Verbindung zurückgesetzt, wenn das Netzwerk die Instanz über die Unterbrechung benachrichtigt. Wenn die Clientanwendung ausfällt oder der Clientcomputer ausfällt oder neu gestartet wird, wird auch die Verbindung unterbrochen, und die Instanz des Datenbankmoduls setzt alle ausstehenden Verbindungen zurück, wenn das Netzwerk den Ausfall meldet. Wenn der Client die Anwendung abmeldet, werden alle ausstehenden Transaktionen zurückgesetzt.
(Übrigens sollte das Wort Verbindungen im vorletzten Satz wohl sein Transaktion . Ich weiß nicht , wie man rollt eine Verbindung zurück.)
In ähnlicher Weise kann SQL Server während der Wiederherstellung Transaktionen rückgängig machen oder wiederholen, nachdem der Server unerwartet heruntergefahren wurde. Dies hängt vom Status der Transaktion zum Zeitpunkt des Herunterfahrens ab. Ich habe Leute gesehen, die diese Taktik angewendet haben, um das zu erreichen, was Sie versucht haben (die Transaktion (en) abzubrechen), und als der Server wieder hochgefahren wurde, wurde ein Großteil der Arbeit einfach wiederholt (so dass der Nettoeffekt ihrer Knie-Ruck-Reaktion viel enger war auf Null als erwartet).
Ich schlage daher vor, dass Sie in Zukunft mehr Disziplin bei der Ausführung von Ad-hoc-Abfragen für wichtige Systeme haben, als in Panik zu geraten, z. B. ein Netzwerkkabel herauszureißen oder den Computer auszuschalten. Zum Beispiel anstelle von:
UPDATE dbo.sometable
-- where *oops* I forgot this part
Nimm das:
BEGIN TRANSACTION;
UPDATE dbo.sometable
-- where *oops* I forgot this part
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;
Wenn das Update korrekt war, können Sie das COMMIT
Teil markieren und ausführen. Wenn nicht, können Sie das Teil ruhig markieren ROLLBACK
und ausführen. Sie können sogar Add-Ins wie SSMS Tools Pack verwenden , um Ihre New Query
Vorlage so zu bearbeiten , dass sie diese Boilerplate enthält.
Jetzt kann es immer noch zu Problemen kommen, wenn Sie die Abfrage ausführen und dann nicht entweder Commit oder Rollback, denn jetzt Ihre Transaktion andere Benutzer blockiert. Dies ist jedoch besser, als Daten unwiderruflich zu ändern.
Und natürlich haben Sie wie immer ein Backup, auf das Sie sich verlassen können.