前言
先前對於 ISOLATION LEVEL 非常的陌生,直到這次公司專案遇到資料讀取/更新相關需求才開始認識ISOLATION LEVEL。當資料準確性(像金額資料)要求相當高的情況下,ISOLATION LEVEL 就必須更加嚴謹,但相對的效能就會有所影響,魚與熊掌,不可兼得。
介紹
TRANSACTION ISOLATION LEVEL 大致上可以分成四種:
1. READ UNCOMMITTED
寬鬆級別:A 交易更新但未確認資料,B交易不能更新只能讀取(直到A交易提交後),確保交易更新資料不會有問題。
2. READ COMMITTED
比較嚴格一些:A 交易更新並確認資料前,其他交易不能讀取該資料
官網說明:READ COMMITTED 隨著 READ_COMMITTED_SNAPSHOT 設定而異,請參考最下方餐可考資料
3. REPEATABLE READ
更嚴格一點的限制:讀取中資料會被鎖定,確保同一筆交易中的讀取資料必須相同
4. SERIALIZABLE
最嚴謹的限制:A 交易讀取時,B交易更新要排隊;A交易更新時,B交易讀取與更新都需要排隊
語法:
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
使用方法:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM TableA
測試
我們使用 Study4 Activity 資料表進行測試,我們挑選 Id = 13的資料進行測試
接下來我們透過交易對於 IsEnable 進行更改,但不 commit
我們透過設定 REPEATABLE READ Level 撈取資料,會發現…讀取不到
接下來我們單獨執行COMMIT TRANSACTION
撈取資料的 query 就回傳資料了
參考資料
1. SET TRANSACTION ISOLATION LEVEL (Transact-SQL) - https://msdn.microsoft.com/zh-tw/library/ms173763(v=sql.120).aspx
0 留言