[SQL] 使用 交易隔離等級 鎖定資料表動作

摘要:[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

 

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)