日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Sql Server之旅

 咸咸咸咸魚干 2019-05-15

  曾今有件事情讓我記憶猶新,那年剛來攜程不久,馬上就被安排寫一個接口,供企鵝公司調(diào)用他們員工的差旅信息,然后我就三下五除二的給寫好

了,上線之后,大概過了一個月。。。DBA那邊報告數(shù)據(jù)庫出現(xiàn)大量鎖超時,并且及時根據(jù)sql的來源將email發(fā)到了我們部門,指出sql讀取時間過長,

并且缺少nolock,影響了大量機(jī)票訂單入庫,然后我就拿著sql去生產(chǎn)環(huán)境跑了下,22s。。。花擦。。。項目上線時間太久,版本已經(jīng)不存在了,無法

回滾。。。原本準(zhǔn)備撤下接口。。??戳讼鲁废陆涌诟由蟦olock時間相差不多,最后決定先加上nolock,發(fā)布緊急單。。。然后再優(yōu)化,DBA那邊暫

時做手工解鎖,發(fā)上去后,最后就是損失XXXX訂單。。。定級為三級事件。然后就是追責(zé),當(dāng)然這個責(zé)任只能有老大們?nèi)コ袚?dān)了,出了這次由我引發(fā)的

事件,我得思考了,出了事情對我不見得全是壞事,起碼這次會讓我銘記如心,想想也搓,來攜程之前根本就不會關(guān)注要不要給select指定nolock,這其

中也包括自己沒遇到過大數(shù)據(jù)吧,也包括自己的能力有限,只知道有鎖這個玩意,細(xì)說的話就啥也不知道了,后來才知道攜程有個規(guī)則,就是很多業(yè)務(wù)產(chǎn)

線所寫的select都必須指定nolock,懂一點的人可能會說nolock可以提升性能,如果你這樣說,確實是這樣,因為數(shù)據(jù)庫的鎖是有96字節(jié)開銷的,沒了

鎖,也就沒有你在profile中看到accquired和released痙攣了,當(dāng)你看完我的事件之后,你可能會意識到,性能提升不是最關(guān)心的,最關(guān)心就是不要出現(xiàn)

死鎖,鎖等待。。。好了,言歸正傳,下面我們看看到底在數(shù)據(jù)庫中可以指定多少個鎖???

 

一:到底可以指定多少個鎖

  這個問題有意思,我們不需要記,只要你裝一個SQL Prompt,有了這個神器,你就知道到底有多少個?如下圖:

1 DROP TABLE dbo.Person
2 CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT 'xxxxx')
3 INSERT INTO dbo.Person DEFAULT VALUES
4 go 6

一眼掃下去,還是蠻多的,不過你要注意了,那些所謂的XXXLock才是我們需要關(guān)注的,根據(jù)上面的圖,我們大概把鎖分個類。。。

粒度鎖:PAGLOCK, TABLOCK, TABLOCKX, ROWLOCK, NOLOCK

模式鎖:HOLDLOCK, UPDLOCK, XLOCK

接下來我從粒度鎖說起:

1. NOLOCK

  都說nolock是無鎖模式的,那到底是怎樣的無鎖呢???到這篇為止,你應(yīng)該知道,如果不加nolock,我們的表,數(shù)據(jù)頁是附加IS鎖的,那接

下來我用profile看下兩者有什么區(qū)別?!?/p>

 

從上圖中,你會看到加上nolock之后,object上面附加了Sch-S鎖,這個鎖叫做“架構(gòu)穩(wěn)定鎖”,很簡單就是sql編譯時附加的一把鎖,目的就是

防止在編譯時,有其他連接修改表結(jié)構(gòu),而這個鎖只與Sch-M鎖沖突,與其他鎖都兼容,這說明什么?說明其他連接鎖住了記錄也沒關(guān)系,我的

nolock不跟他們打交道,這樣的話,就可能會讀到臟數(shù)據(jù),不過沒關(guān)系,攜程的很多業(yè)務(wù)是容許臟數(shù)據(jù)的,畢竟比鎖等待,死鎖要強(qiáng)得多,再說

nolock讀到了其他連接未修改或者未提交的數(shù)據(jù),這個概率也比較低,就算遇到了也沒關(guān)系,一般不會招來客訴的,客人或許再刷下頁面,數(shù)據(jù)

或許就正確了,對不對。。。

 

2.TABLOCK

  這個還是比較見名識義的,就是附加在table上的鎖,也就是表鎖了,很恐怖的。。。下面我舉個Update的例子,看看前后對比。

在上面你有沒有看到,X鎖已經(jīng)附加到OBJECT上面去了。。。這樣的話,其他連接就動不了這個Object了,只能等待。。。

 

3.  PAGLOCK

  看了名字你應(yīng)該也知道,就是附加到頁面這個級別的鎖,我也舉一個Update的例子。

1 BEGIN TRAN
2 UPDATE dbo.Person SET NAME='aaaaa' WHERE ID=6
3 
4 BEGIN TRAN
5 UPDATE dbo.Person WITH(PAGLOCK) SET NAME='bbbbb' WHERE ID=4

從上面兩個圖中,你應(yīng)該可以看到,原來附加到RID上面的U鎖,由于PagLock的提升,現(xiàn)在要附加到Page上面了,這個就是所謂的數(shù)據(jù)頁鎖。

 

4.TABLOCKX, ROWLOCK

   這兩個我就不細(xì)說了,TABLOCKX就是直接附加在table上的X鎖,你可以通過select看一下。

ROWLOCK的話,默認(rèn)情況下就是ROWLOCK,比如默認(rèn)的Update,你會發(fā)現(xiàn)RID上被附加的U鎖,這個就是行鎖。

 

5.UPDLOCK

 這個鎖還是蠻有意思的,它就是update鎖,如果你select下,它會呈現(xiàn)update的鎖痙攣效果。

  

6. XLOCK

  知道了UPDLOCK鎖,我想XLOCK你也應(yīng)該明白了。。。它就是delete鎖,即排他鎖,我可以讓select帶上排他鎖。

 

7.HOLDLOCK

  最后一個我也沒鬧明白,據(jù)說是讓語句在整個事務(wù)中持有鎖,然后我就用select和update調(diào)試一下。

1 SELECT * FROM dbo.Person(HOLDLOCK)
2 UPDATE dbo.Person WITH(HOLDLOCK) SET NAME='bbbbb' WHERE ID=4

從圖中可以看到,HOLDLOCK不管是在select還是Update中,都是對表持有鎖,沒心情研究了,明天可以回家了。。。留給大家觀察吧。

 

最后祝大家新年愉快,闔家歡樂,我也終于在年前完成了這個系列,也祝賀祝賀自己。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多