鎖機制
NOLOCK和READPAST的區別。
1. 開啟一個事務執行插入數據的操作。
BEGIN TRAN tINSERT INTO CustomerSELECT 'a','a'
2. 執行一條查詢語句。
SELECT * FROM Customer WITH (NOLOCK)
結果中顯示”a”和”a”。當1中事務回滾后,那么a將成為臟數據。(注:1中的事務未提交) 。NOLOCK表明沒有對數據表添加共享鎖以阻止其它事務對數據表數據的修改。
SELECT * FROM Customer
這條語句將一直死鎖,直到排他鎖解除或者鎖超時為止。(注:設置鎖超時SET LOCK_TIMEOUT 1800)
SELECT * FROM Customer WITH (READPAST)
這條語句將顯示a未提交前的狀態,但不鎖定整個表。這個提示指明數據庫引擎返回結果時忽略加鎖的行或數據頁。
3. 執行一條插入語句。
BEGIN TRAN tINSERT INTO CustomerSELECT 'b','b'COMMIT TRAN t
這個時候,即使步驟1的事務回滾,那么a這條數據將丟失,而b繼續插入數據庫中。
NOLOCK
1. 執行如下語句。
BEGIN TRAN tttSELECT * FROM Customer WITH (NOLOCK)WAITFOR delay '00:00:20'COMMIT TRAN ttt
注:NOLOCK不加任何鎖,可以增刪查改而不鎖定。