關于數據庫鎖機制

書讀百遍,不如 敲一遍代碼...
先解釋一下名詞

共享鎖(S):一般是Select 查詢是自帶共享鎖圈盔;共享鎖允許多個用戶同時查詢和修改(默認是這樣,除非單獨設置共享鎖的生命周期近她,以下會說到);
排它鎖(X):一般是Insert湖蜕,Update,Delete時會自動加排它鎖叨吮;

我們先看一個正常的例子:
一辆布,
多個事務查詢框模擬多個用戶:

begin tran 
-- S鎖
select * from users  where id= 1
--等待10秒
WaitFor DELAY '00:00:05'
commit;

begin tran 
update users set Name= 'ttttt3' where id = 1
commit;

此時:第二個事務查詢框不受第一個查詢框的影響,可以直接出數據挤安;證明Select的共享鎖在查詢后直接就默認釋放掉了谚殊;

二,
begin tran 
-- S鎖
select * from users with(holdlock)  where id= 1
--等待10秒
WaitFor DELAY '00:00:05'
commit;

begin tran 
update users set Name= 'ttttt3' where id = 1
commit;

此時:第二個事務的更新操作受第一個事務的影響蛤铜,需要等待5秒也就是第一個事務Commit的時候,才能執(zhí)行丛肢;with(holdlock) 就是人為的提高了事務一Select共享鎖的生命周期围肥;

三,
begin tran 

update users set Name= 'tt' where id = 1
WaitFor DELAY '00:00:05'

commit;


begin tran 
-- S鎖
select * from users  where id= 1

commit;

此時:第二個事務的更新或者查詢操作受第一個事務的影響蜂怎,需要等待5秒也就是第一個事務Commit的時候穆刻,才能執(zhí)行;第一個事務的update操作添加了排它鎖杠步,只有等commit提交事務的時候才會釋放氢伟;

四榜轿,
begin tran 

update users set Name= 'tt222' where id = 1
WaitFor DELAY '00:00:05'

commit;
--rollback

begin tran 
-- S鎖
select * from users with(nolock)  where id= 1

commit;

此時:第二個事務者查詢操作不受第一個事務的影響,可以直接出結果朵锣;但是第二個事物使用了with(nolock) 就是忽略鎖的意思谬盐; 在第一個事務失敗rollback的情況下可能會出現臟讀的情況(第二個事物實際讀取的是第一個事務的更新后的數據);

五诚些,死鎖
begin tran 

update users set Name= 'tt' 
WaitFor DELAY '00:00:05'
-- S鎖
select * from uu with(holdlock)
commit;


begin tran 

update uu set Name= 'ttttt3' 
--WaitFor DELAY '00:00:50'
select * from users with(holdlock)
commit;

image.png

此時:
兩個事務之間出現死鎖飞傀; 事務一對users添加排它鎖,并同時等待5秒鐘诬烹; 事務二對uu 添加排它鎖砸烦,并以(holdlock)方式 訪問users表,但此時users排它鎖并沒有釋放绞吁,所以無法添加共享鎖幢痘,所以一直等待事務一釋放排它鎖;
此時事務一訪問uu 家破,同樣的uu排它鎖并未釋放颜说,由此導致兩個事務之間相互等待造成死鎖;
死鎖的造成方式還有很多種员舵,總結就是對A中的A1添加了排它鎖脑沿,在B中B1添加了排它鎖,同時在A中訪問B1,在B中訪問A1马僻,由此相互等待造成死鎖庄拇;

最后附上鎖類型:
HOLDLOCK: 在該表上保持共享鎖,直到整個事務結束韭邓,而不是在語句執(zhí)行完立即釋放所添加的鎖措近。   
NOLOCK:不添加共享鎖和排它鎖女淑,當這個選項生效后瞭郑,可能讀到未提交讀的數據或“臟數據”,這個選項僅僅應用于SELECT語句鸭你∏牛   
PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)袱巨「笞唬  
READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執(zhí)行掃描。默認情況下愉老,SQL Server 2000 在此隔離級別上操作场绿。 
READPAST: 跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行嫉入,而不是阻塞直到其他事務釋放鎖焰盗,READPAST僅僅應用于READ COMMITTED隔離性級別下事務操作中的SELECT語句操作璧尸。  
READUNCOMMITTED:等同于NOLOCK熬拒∫猓   
REPEATABLEREAD:設置事務為可重復讀隔離性級別∶蜗妫  
ROWLOCK:使用行級鎖瞎颗,而不使用粒度更粗的頁級鎖和表級鎖“埔椋   
SERIALIZABLE:用與運行在可串行讀隔離級別的事務相同的鎖語義執(zhí)行掃描哼拔。等同于 HOLDLOCK“曷  
1TABLOCK:指定使用表級鎖倦逐,而不是使用行級或頁面級的鎖,SQL Server在該語句執(zhí)行完后釋放這個鎖宫补,而如果同時指定了HOLDLOCK檬姥,該鎖一直保持到這個事務結束》叟拢  
TABLOCKX:指定在表上使用排它鎖健民,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。  
UPDLOCK :指定在讀表中數據時設置更新 鎖(update lock)而不是設置共享鎖窘拯,該鎖一直保持到這個語句或整個事務結束可款,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據)炊昆,并且保證在后來再更新數據時,這一段時間內這些數據沒有被其他用戶修改。

參考文檔:
博客園
博客園
CSDN

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸳劳,隨后出現的幾起案子,更是在濱河造成了極大的恐慌也搓,老刑警劉巖赏廓,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異傍妒,居然都是意外死亡楚昭,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門拍顷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塘幅,你說我怎么就攤上這事昔案∧蚱叮” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵踏揣,是天一觀的道長庆亡。 經常有香客問我,道長捞稿,這世上最難降的妖魔是什么又谋? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮娱局,結果婚禮上彰亥,老公的妹妹穿的比我還像新娘。我一直安慰自己衰齐,他們只是感情好任斋,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耻涛,像睡著了一般废酷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抹缕,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天澈蟆,我揣著相機與錄音,去河邊找鬼卓研。 笑死趴俘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鉴分。 我是一名探鬼主播哮幢,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼志珍!你這毒婦竟也來了橙垢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤伦糯,失蹤者是張志新(化名)和其女友劉穎柜某,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體敛纲,經...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喂击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了淤翔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰绊。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出监嗜,到底是詐尸還是另有隱情谐檀,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布裁奇,位于F島的核電站桐猬,受9級特大地震影響,放射性物質發(fā)生泄漏刽肠。R本人自食惡果不足惜溃肪,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望音五。 院中可真熱鬧惫撰,春花似錦、人聲如沸放仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诞挨。三九已至莉撇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惶傻,已是汗流浹背棍郎。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留银室,地道東北人涂佃。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蜈敢,于是被迫代替她去往敵國和親辜荠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容