擦亮自己的眼睛去看SQLServer之談談鎖機制

2022-04-02 04:44:45 字數 3207 閱讀 9818

在談談sqlserver的鎖機制之前,來思考以下這個場景:當你在酷暑的時候騎著自己的小車往目的地行走時,路上連續遇到幾個時間很長的紅燈,是不是很鬱悶?有時候你可能實在受不了闖了個紅燈,其實在大部分情況下問題不大,如果通行的汽車很多那就不好說了。因為不遵守規則的人太多,都為了達到目的去走捷徑,不願意等待。這樣才有了交警。交警的作用就是維護這些紅綠燈的規則。這些紅綠燈就像鎖一樣,鎖住或延長你去目的地的時間。但是如果沒有交警大家又不自由遵守紅綠燈規則會導致什麼呢?大家想想都知道。

這個系列的一篇文章中提供的事務管理器中有個鎖管理器就是這裡的交警。它維護著sqlserver中的鎖。前段提到的大部分情況指的就是在系統事務量不大的時候,這時候的鎖永遠不會是什麼大問題。除非你知道你的系統永遠就給幾個人用,否則考慮到避免系統以後的併發量上公升引起資料安全與效率問題,那你得深入了解鎖機制。在研究鎖之前,假定你已經了解事務的acid概念,它是整個sqlserver的精髓所在。如果沒有事務那就不用談鎖了,除了事務需要鎖以外其他任何東西都需要這個讓sql不自由的機制。說到底鎖是乙個平衡併發與資料安全的機制,如果沒有鎖,任何sql都能覆蓋其他sql執行的資料,那麼資料會出現不一致的情況。如果鎖得太狠,那將影響資料庫系統的併發性以及效率(包括鎖本身帶來的額外開銷)。這時候就需要去權衡,sqlserver鎖管理器就充當權衡這兩者關係的角色,如下圖所示:

sqlserver中鎖的知識點實在太多,比如鎖從模式上分為:共享鎖(s)、更新鎖(u)、排他鎖(x)、架構鎖(sch-s、sch-m)、意向鎖(is、iu、ix)、轉換鎖(six、siu、uix)、大容量更新鎖(bu);鎖從粒度上分為:資料庫鎖、檔案鎖、表鎖、堆鎖、索引鎖、頁鎖、鍵鎖、區鎖、行鎖、應用程式鎖、元資料鎖;鎖之間存在相容性問題;鎖會根據情況進行公升級;鎖控制不好會出現死鎖;悲觀鎖的隔離性:未提交讀、已提交讀、可重複讀、可序列化;樂觀鎖的隔離性:讀提交快照隔離、快照隔離;閂(shuan)鎖。。。隨便列下就一大堆問題要說清楚需要花很大篇幅。還是抱著與前幾篇文章的風格,仔細分析乙個具體的問題——鎖公升級。

1、準備

有乙個動態管理檢視可以檢視所有鎖:sys.dm_tran_locks,還有乙個動態管理檢視可以檢視哪些請求正在阻塞其他的請求:sys.dm_os_waiting_tasks

2、什麼是鎖公升級

鎖公升級是指鎖的粒度由細向粗轉換。如:由行鎖轉成表鎖。

3、需要鎖公升級嗎?

一般來說,鎖的粒度越小,併發性越好但是如果去鎖定的東西多就需要的鎖越多,這樣會消耗sqlserver的cpu與記憶體。乙個鎖占用記憶體約為96位元組,你算算如果用行鎖去鎖定百萬千萬的表需要多少記憶體。而且管理鎖(建立鎖、維護鎖、銷毀鎖等)也是有代價的,會消耗cpu。 如果用乙個大點的鎖就將這些百萬千萬的鎖合併成乙個鎖了,管理起來也方便消耗資源也小。

4、什麼時候出現鎖公升級

sqlserver意識到鎖定的頁面或行數過大的時候發生。怎麼意識到過大呢?由兩種方法識別:請求用於的鎖的數目超過鎖數目臨界值;鎖管理器為單獨乙個查詢消耗過多的記憶體超過記憶體臨界值。有其他乙個超過臨界值,sqlserver就會試圖公升級。注意這裡說的鎖資料以及記憶體是值由同乙個查詢發生的,而不是總共的。這裡說的臨界值並不是固定的,sqlserver採用啟發式演算法去動態調整。

5、控制鎖公升級

sqlserver提供一些可以讓我們控制鎖公升級的入口。在sqlserver2008中可以通過:

alter table test

set (lock_escalation = auto|table|disable)

我們還可以通過在**中顯示指定pagelock、tablock提示,會強制sqlserver使用更粗的鎖。不過這個設定不合理的話會導致併發降低。建議一般情況下不用,除非你很清楚這樣帶來的影響。

6、舉例說明 

6.1建庫建表:

create database test

create table test

(id identity(1,1) primary key,

[name] varchar(50) not null default '',

createdtime datetime not null default getdate();

)檢視當前鎖情況:

預設某個連線對整個資料庫有個共享鎖。

6.2迴圈插入幾十萬條記錄:

while 1 = 1

insert into test(name) values ('kk')

插入時的鎖快照 :

從上圖中看出這個快照中有:三個資料庫共享鎖、乙個頁級意向排他鎖、乙個表級意向排他鎖、兩個行級排他鎖。

三個資料庫共享鎖:前面已經提過,預設某個連線對整個資料庫有個共享鎖;

乙個頁級意向排他鎖、乙個表級意向排他鎖:在頁以及表級表示資源的一部分實際已經有鎖進行保護,這樣的好處允許其他請求鎖在表頁級別上進行檢查,減少不必要的更細的鎖請求,提高效能。比如在這種情況下,如果允許alter操作那麼這個操作就會等待因為這裡有表級排他鎖,它提示alter操作該錶有活動。

6.3 跟蹤lock:escalation事件

在profiler中設定只跟蹤lock:escalation事件,鎖公升級事件。

6.4更新表中記錄:

update test set name = 'name' where name = 'kk'

在profiler中看到了lock:escalation事件被觸發:

更新時的快照為(按順序):

如上圖:此時update操作以排他鎖定它更新的行。

如上圖:此時釋放了對元資料表的架構穩定鎖(sch-s)鎖,剩下對整個表的排他鎖。

從上面的分析中,發現sqlserver鎖機制是有點複雜的,不過也是很有意思的。研究後,你會發現它真的很智慧型。今天分析就到此結束,文中如有描述不當的地方,歡迎指出。共同進步才是硬道理。

保護自己的眼睛

專家介紹說,長時間對著電腦 電視看比賽,眨眼次數減少,會導致角膜乾燥 眼乾 眼澀 眼疼等不適症狀的出現,兒童和青少年長時間用眼還很容易引起假性近視。因此,看電視或電腦40 50分鐘後要休息一下,適當在屋內走動,有利於緩解眼部疲勞。電腦要放在光線充足的地方,眼睛距離電腦以30 50厘公尺為宜。出現眼乾...

擦亮眼睛 看清諾基亞推出上網本的虛招

該來的終歸要來 8月24日晚間訊息,諾基亞正式宣布推出基於windows的booklet 3g 移動電腦 上網本 上網本booklet 3g採用了鋁製外殼,配備主流的10寸螢幕以及atom平台,進軍競爭激烈但仍具備巨大發展空間的上網本市場。基於英特爾凌動平台的諾基亞3g上網本 更為難能可貴的是,諾基...

jellyfish教你如何修飾自己的眼睛

流行的煙灰色暈染的眼瞼使眼神足夠深邃,但卻不夠閃亮。而含有珠光感的眼影粉與眼影霜卻能打造出理想的blingbling 效果。不用害怕在眼皮上大面積地使用閃亮色,霜狀與粉狀眼影搭配使用更能提公升眼部的立體感。step1 霜狀珠光眼影打底色 霜狀眼影質地必須優先使用。先將眼影輕抹於眼窩,推開後用指腹按壓...