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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sql Server之旅——终点站 nolock引发的三级事件的一些思考

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sql Server之旅——终点站 nolock引发的三级事件的一些思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

曾今有件事情讓我記憶猶新,那年剛來攜程不久,馬上就被安排寫一個接口,供企鵝公司調用他們員工的差旅信息,然后我就三下五除二的給寫好了,上線之后,大概過了一個月。。。DBA那邊報告數據庫出現大量鎖超時,并且及時根據sql的來源將email發到了我們部門,指出sql讀取時間過長,并且缺少nolock,影響了大量機票訂單入庫,然后我就拿著sql去生產環境跑了下,22s。。。花擦。。。項目上線時間太久,版本已經不存在了,無法回滾。。。原本準備撤下接口。。。看了下撤下接口跟加上nolock時間相差不多,最后決定先加上nolock,發布緊急單。。。然后再優化,DBA那邊暫時做手工解鎖,發上去后,最后就是損失XXXX訂單。。。定級為三級事件。然后就是追責,當然這個責任只能有老大們去承擔了,出了這次由我引發的事件,我得思考了,出了事情對我不見得全是壞事,起碼這次會讓我銘記如心,想想也搓,來攜程之前根本就不會關注要不要給select指定nolock,這其中也包括自己沒遇到過大數據吧,也包括自己的能力有限,只知道有鎖這個玩意,細說的話就啥也不知道了,后來才知道攜程有個規則,就是很多業務產線所寫的select都必須指定nolock,懂一點的人可能會說nolock可以提升性能,如果你這樣說,確實是這樣,因為數據庫的鎖是有96字節開銷的,沒了鎖,也就沒有你在profile中看到accquired和released痙攣了,當你看完我的事件之后,你可能會意識到,性能提升不是最關心的,最關心的就是不要出現死鎖,鎖等待。。。好了,言歸正傳,下面我們看看到底在數據庫中可以指定多少個鎖???

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

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

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

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

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

  • 模式鎖:HOLDLOCK, UPDLOCK, XLOCK

接下來我從粒度鎖說起:

1. NOLOCK

都說nolock是無鎖模式的,那到底是怎樣的無鎖呢???到這篇為止,你應該知道,如果不加nolock,我們的表,數據頁是附加IS鎖的,那接下來我用profile看下兩者有什么區別。

從上圖中,你會看到加上nolock之后,object上面附加了Sch-S鎖,這個鎖叫做“架構穩定鎖”,很簡單就是sql編譯時附加的一把鎖,目的就是防止在編譯時,有其他連接修改表結構,而這個鎖只與Sch-M鎖沖突,與其他鎖都兼容,這說明什么?說明其他連接鎖住了記錄也沒關系,我的nolock不跟他們打交道,這樣的話,就可能會讀到臟數據,不過沒關系,攜程的很多業務是容許臟數據的,畢竟比鎖等待,死鎖要強得多,再說nolock讀到了其他連接未修改或者未提交的數據,這個概率也比較低,就算遇到了也沒關系,一般不會招來客訴的,客人或許再刷下頁面,數據或許就正確了,對不對。。。

2.TABLOCK

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

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

3. PAGLOCK

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

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

從上面兩個圖中,你應該可以看到,原來附加到RID上面的U鎖,由于PagLock的提升,現在要附加到Page上面了,這個就是所謂的數據頁鎖。

4.TABLOCKX, ROWLOCK

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

ROWLOCK的話,默認情況下就是ROWLOCK,比如默認的Update,你會發現RID上被附加的U鎖,這個就是行鎖。

5.UPDLOCK

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

6. XLOCK

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

7.HOLDLOCK

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

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

從圖中可以看到,HOLDLOCK不管是在select還是Update中,都是對表持有鎖,這個就留給大家觀察哈~~~

好了,本系列就到此為止,希望您學的愉快,吃的開心!

總結

以上是生活随笔為你收集整理的Sql Server之旅——终点站 nolock引发的三级事件的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。