可序列化(serializable)隔離級別用來阻止所謂的幻影記錄(phantom records)。為了阻止它們,sql server使用鍵範圍鎖定(key-range locking)技術。我們來看下面的select語句:
1這個語句請求stateprovinceid在10到12之間的所有記錄。如果你在可序列化(serializable)隔離級別執行這個語句,這些範圍內的ids會被鎖定,保護它不會被資料修改:select
*from
person.address
2where stateprovinceid between
10and123
go
這個範圍之外的修改是允許的,因為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現在當你檢視執行計畫時,你會看到查詢優化器引用了這個新建立的索引並與書籤查詢(bookmark lookup)進行了組合。--create a supporting non-clustered index
2create
nonclustered
index idx_stateprovinceid on
person.address(stateprovinceid)
3go
當你在可序列化(serializable)隔離級別裡再次執行select語句,你不會觸發鎖公升級了,因為物理上你唯讀20條請求行。
可序列化(serializable)隔離級別是最有限制的乙個,它會阻止幻影記錄(phantom records)。sql server內部使用鍵範圍鎖定(key-range locking)技術來保持請求範圍行的穩定。這裡你要記住最重要的是你在你搜尋謂語(search predicate)上要有支援的非聚集索引。不然的話你需要掃瞄你的整個表,如果你讀取超過5000行,你就會觸發鎖公升級(lock escalations)。
可序列化隔離級別裡的鎖公升級
在今天的文章裡我會討論下可序列化 serializable 隔離級別裡會有的鎖公升級 lock escalations 還有你如何避免。在上個月的7月14日,我已經介紹了sql server裡鎖公升級 lock escalations 的基本概念還有為什麼需要它們。因此請你回到這個文章來理解下這個非...
序列化隔離級別Key Range鎖定的真實鍵範圍
大家都知道在序列化隔離級別中引入了鍵範圍鎖定。鍵範圍鎖可防止其他事務插入其鍵值位於可序列化事務讀取的鍵值範圍內的新行,從而確保滿足此要求。但是對於鎖定的範圍真的清楚嗎?前幾天看到有人對於鎖範圍的疑問,發現鎖定的資料比想象的要多。下面我們看個例子 create tableand insert test...
InnoDB實現序列化隔離級別的方法
序列化的實現 innodb對於序列化的實現方式,是通過兩種方式實現的。第一種,當select語句在乙個顯式的事務塊內,如執行表11 9中的編號為1的情況,將施加lock s鎖,根據表11 6 記錄鎖事務鎖相容表 可知,lock s鎖排斥寫鎖,所以序列化隔離級別下只允許併發地讀取操作,併發寫被禁止,因...