iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0

前言

先前對於 ISOLATION LEVEL 非常的陌生,直到這次公司專案遇到資料讀取/更新相關需求才開始認識ISOLATION LEVEL。當資料準確性(像金額資料)要求相當高的情況下,ISOLATION LEVEL 就必須更加嚴謹,但相對的效能就會有所影響,魚與熊掌,不可兼得。


介紹

TRANSACTION ISOLATION LEVEL 大致上可以分成四種:

  1. READ UNCOMMITTED
    寬鬆級別:A 交易更新但未確認資料,B交易不能更新只能讀取(直到A交易提交後),確保交易更新資料不會有問題。

  2. READ COMMITTED
    比較嚴格一些:A 交易更新並確認資料前,其他交易不能讀取該資料

官網說明:READ COMMITTED 隨著 READ_COMMITTED_SNAPSHOT 設定而異,請參考最下方餐可考資料

  1. REPEATABLE READ
    更嚴格一點的限制:讀取中資料會被鎖定,確保同一筆交易中的讀取資料必須相同

  2. 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

上一篇
10. 動態組合 SQL 與執行語法 - sp_executesql
下一篇
12. Hint: WITH NOLOCK
系列文
SQL Server 學習日誌30

尚未有邦友留言

立即登入留言