我的印象是,在將SQL Server數據庫的所有更新應用到基礎數據庫之前,首先添加了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