日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Sql Server之旅——第十二站 对锁的初步认识

發(fā)布時(shí)間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sql Server之旅——第十二站 对锁的初步认识 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作為一個(gè)開(kāi)發(fā)人員,鎖機(jī)制也是我們程序員必須掌握的東西,很久之前在學(xué)習(xí)鎖的時(shí)候,都是教科書(shū)上怎么說(shuō),然后我怎么背,缺少一個(gè)工具讓我們眼見(jiàn)為實(shí)。。。如果這樣的話,學(xué)習(xí)一個(gè)東西就很容易忘記。。。因?yàn)檫@些都是你背誦過(guò)來(lái)的。。。這篇的話我就來(lái)分享一個(gè)工具來(lái)幫助我們學(xué)習(xí)鎖。

一:到底都有哪些鎖

學(xué)習(xí)鎖之前,必須要知道鎖大概有幾種???通常情況下作為碼農(nóng)我們只需知道如下幾個(gè)鎖即可。。。

1.S(Share)鎖

為了方便理解,我們可以直接這么認(rèn)為,當(dāng)在select的時(shí)候在表,數(shù)據(jù)頁(yè),記錄上加上共享鎖。

2.X(Exclusive) 鎖

我們?cè)赿elete數(shù)據(jù)的時(shí)候會(huì)在記錄上附加X(jué)鎖,我們知道X鎖并不與其他的鎖兼容。如果其他的鎖與其遭遇,就會(huì)處于等待,后續(xù)我們?cè)僬f(shuō)。

3.U(Update)鎖

顧名思義,我們?cè)赨pdate的時(shí)候,在尋找記錄的過(guò)程中,會(huì)逐一的給記錄附加U鎖,如果找到了目標(biāo)記錄的話,則會(huì)將U鎖轉(zhuǎn)化為X鎖。。。

4.I (Intent)鎖

這個(gè)就是所謂的意向鎖,一般都是給表和數(shù)據(jù)頁(yè)附加的鎖,好處就是防止被其他連接修改表結(jié)構(gòu)。

二:天下無(wú)敵的SqlServer Profile

這個(gè)工具我想大家都明白,它的監(jiān)視能力真的是無(wú)所不能。。。鎖的痙攣狀態(tài)也全在它的掌握之中。

1. 首先我做一個(gè)Person表,Name字段設(shè)定4000字節(jié),這樣一個(gè)數(shù)據(jù)頁(yè)可以容納2條數(shù)據(jù),如下圖:

DROP TABLE dbo.Person CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT 'aaaaa') --插入6條,生成3個(gè)數(shù)據(jù)頁(yè) INSERT INTO dbo.Person DEFAULT VALUES go 6

2. 下面我們看看數(shù)據(jù)在數(shù)據(jù)頁(yè)的分布情況。

3. 然后我們開(kāi)啟Profile,在“事件選擇”的Events中選擇”Lock:Acquired“和”Lock:Released“ ,然后運(yùn)行,如下圖:

三:使用測(cè)試數(shù)據(jù)

1. 首先我執(zhí)行一個(gè)簡(jiǎn)單的 SELECT * FROM dbo.Person,看看表/數(shù)據(jù)頁(yè)/記錄的加鎖情況。

從圖中可以看到,select執(zhí)行的大概步驟如下:

第一步:給表(Object)加上IS(意向共享鎖)。

第二步:先給1:78號(hào)數(shù)據(jù)頁(yè)加IS鎖,掃描78號(hào)數(shù)據(jù)頁(yè),然后釋放IS鎖。

第三步:同樣的道理掃描之后的數(shù)據(jù)頁(yè)。

第四步:最后釋放表的IS鎖,結(jié)束整個(gè)鎖流程。

看完上面的一系列的Lock:Acquired 和 Lock:Released的話,你有沒(méi)有發(fā)現(xiàn)一個(gè)問(wèn)題,不是說(shuō)好給記錄(RID)加上S鎖么???這里沒(méi)加,

是因?yàn)橐孢M(jìn)入78號(hào)數(shù)據(jù)頁(yè)的時(shí)候,未發(fā)現(xiàn)它存在IU鎖或者IX鎖。。。所以。。。這個(gè)屬于鎖的組合,后續(xù)會(huì)說(shuō)。

2. 接下來(lái)用UPDATE dbo.Person SET NAME='bbbbb' WHERE ID=3來(lái)看看update的整個(gè)過(guò)程,乍一看,Profile捕獲到的記錄還是比較多的,下面具體看圖:

第一步:給表(Object)加上IX鎖,

第二步:給數(shù)據(jù)頁(yè)(1:78)數(shù)據(jù)頁(yè)分配IU鎖。然后開(kāi)始逐一掃描78號(hào)數(shù)據(jù)頁(yè)的RID記錄,進(jìn)入前就Acquired,退出后就Released,當(dāng)掃描完78號(hào)數(shù)據(jù)頁(yè)的所有RID后描完78號(hào)數(shù)據(jù)頁(yè)的所有RID后,再釋放78號(hào)數(shù)據(jù)頁(yè)的IU鎖,進(jìn)入下一個(gè)數(shù)據(jù)頁(yè)。。。

第三步:我們發(fā)現(xiàn)ID=3是在89號(hào)數(shù)據(jù)頁(yè)上,當(dāng)引擎掃到該RID之后,我們觀察到89號(hào)的數(shù)據(jù)頁(yè)由IU鎖變成了IX鎖,并且把1:89:0(slot為0的記錄)由U鎖變成X鎖,變成X鎖后,就排斥了其他所有的鎖,這時(shí)候就可以進(jìn)行Update操作了。

第四步:后面就繼續(xù)90號(hào)數(shù)據(jù)頁(yè),步驟類(lèi)似,第二步和第三步。

不知道細(xì)心的你有沒(méi)有發(fā)現(xiàn),在Released Object之前我們才釋放1:89:0的X鎖,然后釋放89號(hào)數(shù)據(jù)頁(yè)的IX鎖,這說(shuō)明什么???說(shuō)明這個(gè) Update是貫穿于這個(gè)事務(wù)的,不像Select操作中,掃完一個(gè)數(shù)據(jù)頁(yè)就釋放一個(gè)數(shù)據(jù)頁(yè)。

3. 最后再看一個(gè)DELETE FROM dbo.Person WHERE ID=3 的操作。

大概掃了一下上面的圖,或許你感覺(jué)和Update操作大差不差,會(huì)掃描數(shù)據(jù)頁(yè)中的每個(gè)記錄并加上U鎖。當(dāng)在1:89:0槽位中找到了目標(biāo)記錄后,然后將U鎖轉(zhuǎn)化為X鎖,具體可以參考Update。

好了,最最單純的DML操作都展示給你看了...我們知道生產(chǎn)環(huán)境沒(méi)有這么簡(jiǎn)單,但是你有此寶貝,再多動(dòng)動(dòng)腦子就????????了。。。

總結(jié)

以上是生活随笔為你收集整理的Sql Server之旅——第十二站 对锁的初步认识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。