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