本篇文章圖片毀損,請參考此篇文章:https://dog0416.blogspot.com/2020/10/sql-server-transaction-isolation-level.html
先前對於 ISOLATION LEVEL 非常的陌生,直到這次公司專案遇到資料讀取/更新相關需求才開始認識ISOLATION LEVEL。當資料準確性(像金額資料)要求相當高的情況下,ISOLATION LEVEL 就必須更加嚴謹,但相對的效能就會有所影響,魚與熊掌,不可兼得。
TRANSACTION ISOLATION LEVEL 大致上可以分成四種:
READ UNCOMMITTED
寬鬆級別:A 交易更新但未確認資料,B交易不能更新只能讀取(直到A交易提交後),確保交易更新資料不會有問題。
READ COMMITTED
比較嚴格一些:A 交易更新並確認資料前,其他交易不能讀取該資料
官網說明:READ COMMITTED 隨著 READ_COMMITTED_SNAPSHOT 設定而異,請參考最下方餐可考資料
REPEATABLE READ
更嚴格一點的限制:讀取中資料會被鎖定,確保同一筆交易中的讀取資料必須相同
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 就回傳資料了