У меня сложилось впечатление, что все обновления базы данных сервера SQL сначала добавляются в T-Log, а затем применяются к базовой базе данных. В случае сбоя сервера процесс восстановления будет выполнять откат любых незавершенных транзакций. Я также предположил, что это работает с транзакциями, если фиксация или откат не вызваны, изменения не будут внесены.
Итак, я хотел увидеть реакцию SQL-сервера на прерывание транзакций. то есть обновления транзакций без фиксации или отката. То, что я обнаружил, я не совсем понимаю. Особенно, как SQL-сервер может позволить этому случиться.
Я использовал приведенный ниже скрипт для вставки строк в таблицу с задержкой, чтобы дать мне достаточно времени, чтобы остановить транзакцию до того, как она достигнет фиксации или отката. Это, я думаю, имитирует тайм-аут клиентского приложения до завершения транзакции.
Create Table MyTest (Comment varchar(20))
Go
Create Procedure MyProc
as
Begin Try
Begin Transaction
Insert Into MyTest Select 'My First Entry'
WaitFor Delay '00:00:02'
Insert Into MyTest Select 'My Second Entry'
WaitFor Delay '00:00:02'
Insert Into MyTest Select 'My Third Entry'
Commit Transaction
Return 0 -- success
End Try
Begin Catch
If (@@trancount<>0) Rollback Transaction
Declare @err int, @err_msg varchar(max)
Select @err = error_number(), @err_msg = error_message()
Raiserror(@err_msg, 16,1)
Return @err
End Catch
Если вы запустите скрипт, в зависимости от того, как быстро вы остановите процедуру, вы увидите, что первые одна или две вставки останутся в таблице. Может ли кто-нибудь объяснить, почему это произошло?
Select * From MyTest
Я проверял это на SQL 2008.