前言

先前對於 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