Как упоминали Ник и Мартин, конечный статус вашего запроса зависит от того, знает ли SQL Server о подключении сетевого кабеля до завершения запроса. Из Books Online (хотя мне интересно, что существуют эквивалентные темы для этого в 2000 , 2005 , 2008 и 2008 R2 , но не 2012 или 2014):
Если ошибка препятствует успешному завершению транзакции, SQL Server автоматически откатывает транзакцию и освобождает все ресурсы, удерживаемые транзакцией. Если сетевое соединение клиента с экземпляром компонента Database Engine разорвано, все незавершенные транзакции для этого соединения откатываются, когда сеть уведомляет экземпляр об обрыве. Если происходит сбой клиентского приложения или если клиентский компьютер выходит из строя или перезапускается, это также разрывает соединение, и экземпляр компонента Database Engine откатывает все незавершенные соединения, когда сеть уведомляет его о разрыве. Если клиент выходит из приложения, все ожидающие транзакции откатываются.
(Кроме того, слово « соединения» во втором последнем предложении, вероятно, подразумевало транзакции . Я не знаю, как откатить соединение.)
Аналогичным образом, SQL Server может отменить или повторить транзакции во время восстановления после неожиданного выключения сервера, и это будет зависеть от состояния транзакции в момент завершения работы. Я видел, как люди использовали эту тактику, чтобы добиться того, что вы пытались сделать (отменить транзакцию (и)), и когда сервер снова запустился, большая часть работы была просто переделана (поэтому общий эффект от их реакции коленного рефлекса был намного ближе к нулю, чем они ожидали).
Поэтому вместо того, чтобы подвергаться этому, вместо того, чтобы совершать радикальные действия в панике, например, дергать сетевой кабель или выключать компьютер, я предлагаю в будущем улучшить дисциплину при выполнении специальных запросов для важных систем. Например, вместо:
UPDATE dbo.sometable
-- where *oops* I forgot this part
Есть это:
BEGIN TRANSACTION;
UPDATE dbo.sometable
-- where *oops* I forgot this part
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;
Затем, если обновление действительно было правильным, вы можете выделить COMMIT
деталь и запустить ее. Если это не так, вы можете спокойно выделить ROLLBACK
часть и запустить ее. Вы даже можете использовать надстройки, такие как SSMS Tools Pack, чтобы отредактировать New Query
шаблон, добавив этот шаблон.
Теперь это может привести к проблемам в том случае, если вы выполните запрос, а затем не будете выполнять фиксацию или откат, потому что теперь ваша транзакция блокирует других пользователей. Но это лучше, чем безвозвратно модифицировать данные.
И, конечно, как всегда, есть резервная копия, на которую можно положиться.