摘要:[SQL] 使用 交易隔離等級 鎖定 Table 動作
隔離層級分為四種
- READ UNCOMMITTED : 完全沒有隔離效果,可能讀取其他交易進行中尚未被COMMIT的資料。
- READ COMMITTED : 不允許讀取尚未COMMIT的資料,因為尚未被COMMITTED的資料可能隨時會再變。
- REPEATABLE READ : 在查詢中所讀取的資料會被鎖定,以免被其他使用者更改或刪除,以保證在交易中每次都可以讀到相同的資料。但是,仍然允許其他使用者對資料表的新增資料作業。
- SERIALIZABLE : 在查詢中所讀取的資料會被鎖定,以免被其他使用者更改或刪除,以保證在交易中每次都可以讀到相同的資料。但是,仍然允許其他使用者對資料表的新增資料作業。
使用的方法
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM #table
測試範例(以READ COMMITTED為例)
首先開啟兩個查詢視窗,
第一個查詢視窗,輸入以下語法並執行,此時並未Commit
BEGIN TRAN
SELECT IDNumber FROM #table
UPDATE #table SET IDNumber=IDNumber+1
--ROLLBACK TRAN
--COMMIT TRAN
第二個查詢視窗,輸入以下查詢語法
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM #table
此時去執行第二個查詢視窗的查詢語法時會發現,查詢在等待中,
這就表示在第一個語法執行完並未執行 Commit 動作,所以當第二個視窗的查詢語法執行時,#table 被暫時鎖定了,
這時返回第一個查詢視窗,將 COMMIT 選取後執行,就會發現第二個查詢視窗的語法已經成功查詢到資料了。
以上為使用紀錄,如有錯誤 請指教。
參考:
http://technet.microsoft.com/zh-tw/library/ms173763.aspx
http://lion.ee.ntu.edu.tw/~jamesc/courses/942/DBMS/942DBMS-SQL-CH20.pdf
http://www.dbabeta.com/2010/sql-server-2005-consistent-read.html#more-163
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)