可序列化隔離級別裡的鎖公升級

2021-09-07 01:33:51 字數 2359 閱讀 3045

在今天的文章裡我會討論下可序列化(serializable)隔離級別裡會有的鎖公升級(lock escalations),還有你如何避免。在上個月的7月14日,我已經介紹了sql server裡鎖公升級(lock escalations)的基本概念還有為什麼需要它們。因此請你回到這個文章來理解下這個非常重要的概念。

可序列化(serializable)隔離級別用來阻止所謂的幻影記錄(phantom records)。為了阻止它們,sql server使用鍵範圍鎖定(key-range locking)技術。我們來看下面的select語句:

1

select

*from

person.address

2where stateprovinceid between

10and123

go

這個語句請求stateprovinceid在10到12之間的所有記錄。如果你在可序列化(serializable)隔離級別執行這個語句,這些範圍內的ids會被鎖定,保護它不會被資料修改:

這個範圍之外的修改是允許的,因為sql server只鎖定了那個特定範圍。

鍵範圍鎖定(key-range locking)技術最重要的是在你的查詢謂語上需要支援的非聚集索引。在我們的例子裡是stateprovinceid列。如果在它上面沒有支援的索引定義,在執行計畫裡查詢優化器會選擇聚集索引掃瞄/表掃瞄(clustered index scan/table scan)運算子。這意味著你必須掃瞄你的整個表(用殘留謂語(residual predicate))來找匹配的記錄。

當你在可序列化(serializable)隔離級別裡執行你的select語句,在你掃瞄期間獲得超過5000個鎖時,你會觸發鎖公升級(lock escalations)。下面**演示了當沒有支援的非聚集索引時,你如何觸發鎖公升級(lock escalations)。

1

settransaction

isolation

level

serializable2go

34begin

transaction56

--the following statement causes a lock escalation, because there is no7--

supporting non-clustered index on the column "stateprovinceid"

8select

*from

person.address

9where stateprovinceid between

10and

1210

11--

there is only a s lock on the table itself!

12select

*from

sys.dm_tran_locks

13where request_session_id =

@@spid

1415

rollback

16go

現在讓我們建立支援的非聚集索引。

1

--create a supporting non-clustered index

2create

nonclustered

index idx_stateprovinceid on

person.address(stateprovinceid)

3go

現在當你檢視執行計畫時,你會看到查詢優化器引用了這個新建立的索引並與書籤查詢(bookmark lookup)進行了組合。

當你在可序列化(serializable)隔離級別裡再次執行select語句,你不會觸發鎖公升級了,因為物理上你唯讀20條請求行。

可序列化(serializable)隔離級別是最有限制的乙個,它會阻止幻影記錄(phantom records)。sql server內部使用鍵範圍鎖定(key-range locking)技術來保持請求範圍行的穩定。這裡你要記住最重要的是你在你搜尋謂語(search predicate)上要有支援的非聚集索引。不然的話你需要掃瞄你的整個表,如果你讀取超過5000行,你就會觸發鎖公升級(lock escalations)。

感謝關注!

可序列化隔離級別裡的鎖公升級

可序列化 serializable 隔離級別用來阻止所謂的幻影記錄 phantom records 為了阻止它們,sql server使用鍵範圍鎖定 key range locking 技術。我們來看下面的select語句 1 select from person.address 2where st...

序列化隔離級別Key Range鎖定的真實鍵範圍

大家都知道在序列化隔離級別中引入了鍵範圍鎖定。鍵範圍鎖可防止其他事務插入其鍵值位於可序列化事務讀取的鍵值範圍內的新行,從而確保滿足此要求。但是對於鎖定的範圍真的清楚嗎?前幾天看到有人對於鎖範圍的疑問,發現鎖定的資料比想象的要多。下面我們看個例子 create tableand insert test...

InnoDB實現序列化隔離級別的方法

序列化的實現 innodb對於序列化的實現方式,是通過兩種方式實現的。第一種,當select語句在乙個顯式的事務塊內,如執行表11 9中的編號為1的情況,將施加lock s鎖,根據表11 6 記錄鎖事務鎖相容表 可知,lock s鎖排斥寫鎖,所以序列化隔離級別下只允許併發地讀取操作,併發寫被禁止,因...