mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
鎖的粒度
行級鎖 表級鎖
應(yīng)盡量只鎖定需要修改的那部分?jǐn)?shù)據(jù),而不是所有資源。鎖定的數(shù)據(jù)量越少,發(fā)生鎖爭用的可能性就越小,并發(fā)行就越高。
加鎖需要消耗資源,鎖的各種操作都會增加系統(tǒng)開銷。因此鎖的粒度越小,系統(tǒng)開銷就越大。
在選擇鎖的粒度時,需要在鎖開銷和并發(fā)程度之間作一個權(quán)衡
鎖的類型
1.讀寫鎖
排他鎖,簡寫為X鎖,又稱寫鎖
共享鎖,簡寫為S鎖,又稱讀鎖
規(guī)定:
事務(wù)對數(shù)據(jù)對象A加了X鎖,就可以對A進(jìn)行讀取和更新。加了X鎖,其他事務(wù)就不能再對該數(shù)據(jù)加鎖了
事務(wù)對數(shù)據(jù)對象A加了S鎖,就可以對A進(jìn)行讀取操作,但不能進(jìn)行寫操作,其他事務(wù)可以對A加S鎖,但不能加X鎖。
即只有S鎖和S鎖時兼容的
2.意向鎖
避免加表鎖前逐行確認(rèn)是否加了鎖。逐行確認(rèn)太過麻煩。
意向鎖的作用:
假如事務(wù)A想要申請整個表的寫鎖,那么它需要逐行判斷是否有讀鎖或?qū)戞i存在,效率太低。
意向鎖就是在加鎖前,先對該表加一個意向鎖(IX或IS)。這樣之后再有事務(wù)要申請表的X可以直接判斷表上是否有S\X\IX\IS存在,有的話就先阻塞。
意向鎖是在原有的X/S鎖之上引入IX/IS,IX/IS都是表鎖,用來表示一個事務(wù)想要在表中的某個數(shù)據(jù)行上加X鎖或S鎖。有以下兩個規(guī)定:
一個事務(wù)在獲得某個數(shù)據(jù)行對象的S鎖之前,必須先獲得表的IS鎖
一個事務(wù)在獲得某個數(shù)據(jù)行對象的X鎖之前,必須先獲得表的IX鎖
各種表的兼容關(guān)系(能否在有另一個鎖的時候加鎖):
IX\IS之間兩兩兼容,X\S之間只有S\S兼容
X和任何鎖都不兼容,S鎖還和IS鎖兼容
綜上:只有IS\IX之間,S鎖和IS、S之間兼容,其它均不兼容
MySQL四種鎖的兼容關(guān)系.png
三級封鎖協(xié)議
一級封鎖協(xié)議
事務(wù)T要修改數(shù)據(jù)A必須先加寫鎖X,寫完再釋放。由于X鎖之間不兼容。
故解決了數(shù)據(jù)寫覆蓋的問題。
但不能解決臟讀問題
二級封鎖協(xié)議
在一級封鎖協(xié)議的基礎(chǔ)上,要求讀取數(shù)據(jù)時必須加S鎖,讀取完馬上釋放S鎖
可以解決臟讀問題。事務(wù)A不會讀到事務(wù)B修改了但沒提交的可能的臟數(shù)據(jù)。
三級封鎖協(xié)議
在二級的基礎(chǔ)上,加了S鎖,但在事務(wù)結(jié)束的時候才釋放S鎖。
解決了不可重復(fù)讀問題。因為在事務(wù)沒有釋放S鎖之前,沒有其它事務(wù)能夠修改該數(shù)據(jù)
兩段鎖協(xié)議
兩段鎖協(xié)議規(guī)定所有的事務(wù)應(yīng)遵守的規(guī)則:
① 在對任何數(shù)據(jù)進(jìn)行讀、寫操作之前,首先要申請并獲得對該數(shù)據(jù)的封鎖。
② 在釋放一個封鎖之后,事務(wù)不再申請和獲得其它任何封鎖。
定理:若所有事務(wù)均遵守兩段鎖協(xié)議,則這些事務(wù)的所有交叉調(diào)度都是可串行化的。
充分條件,不是必要條件
MySQL隱式和顯示鎖定
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql server 组件cve_O
- 下一篇: mysql字符集相关问题_MySQL 字