2010-02-05 62 views
0

我的印象是,在將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

回答

2

正確,TXN是使用「預寫日誌」寫入的。有關於它的MSDB文章以及它如何與提交/回滾/檢查點等進行交互

但是,命令timout(或您正在執行的操作只是簡單地停止代碼執行)並且TXN永遠不會回滾並鎖定,直到連接已關閉(或稍後單獨完成)。這是SET XACT_ABORT用於

1

如果你開始一個事務,不提交,或回滾它,你會簡單地得到一個掛交易很可能阻止其他用戶,直到事情是完成當前交易。 SQL Server不會自動提交或回滾事務,只是因爲你的代碼沒有這樣做。交易將保持原樣並阻止其他用戶,直到它被提交或回滾。

現在,我可以非常輕鬆地在我的T-SQL代碼中開始一個事務,而不是提交或回滾它,然後執行Select語句並查看剛剛插入或更新的數據,只要Select語句正在使用與我的交易相同的連接。如果我嘗試使用其他事務進行選擇,我將看不到插入或更新的數據。事實上,直到另一個連接上的事務完成後,Select語句纔可能完成。

相關問題