MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁
1、鎖的分類
1.1從對數(shù)據(jù)操作的類型來分
讀鎖(共享鎖):針對同一份數(shù)據(jù),多個(gè)讀操作可以同時(shí)進(jìn)行而不會(huì)互相影響。
結(jié)論1:
--如果某一個(gè)會(huì)話 對A表加了read鎖,則 該會(huì)話 可以對A表進(jìn)行讀操作、不能進(jìn)行寫操作; 且 該會(huì)話不能對其他表進(jìn)行讀、寫操作。
--即如果給A表加了讀鎖,則當(dāng)前會(huì)話只能對A表進(jìn)行讀操作。
結(jié)論2:
會(huì)話0給A表加了鎖;其他會(huì)話的操作:a.可以對其他表(A表以外的表)進(jìn)行讀、寫操作
b.對A表:讀-可以; 寫-需要等待釋放鎖。、
某回話給某個(gè)表加了讀鎖,所有的回話都能對該表進(jìn)行讀操作,不能進(jìn)行寫操作,除非該會(huì)話釋放讀鎖。
寫鎖(排它鎖):當(dāng)前寫操作沒有完成前,它會(huì)阻斷其他寫鎖和讀鎖。
當(dāng)前會(huì)話(會(huì)話0) 可以對加了寫鎖的表 進(jìn)行任何操作(增刪改查);但是不能 操作(增刪改查)其他表
其他會(huì)話:對會(huì)話0中加寫鎖的表 可以進(jìn)行增刪改查的前提是:等待會(huì)話0釋放寫鎖
2.2從鎖粒度劃分。
一般分為:行鎖、表鎖、庫鎖
(1)行鎖:訪問數(shù)據(jù)庫的時(shí)候,鎖定整個(gè)行數(shù)據(jù),防止并發(fā)錯(cuò)誤。 如InnoDB存儲(chǔ)引擎使用行鎖
(2)表鎖:訪問數(shù)據(jù)庫的時(shí)候,鎖定整個(gè)表數(shù)據(jù),防止并發(fā)錯(cuò)誤。?如MyISAM存儲(chǔ)引擎使用表鎖
行鎖?和?表鎖 的區(qū)別:
- 表鎖: 開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突概率高,并發(fā)度最低
- 行鎖: 開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度小,發(fā)生鎖沖突的概率低,并發(fā)度高
2. 3? 補(bǔ)充? ?悲觀鎖 和 樂觀鎖
(1)悲觀鎖:顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
(2)樂觀鎖:?顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫如果提供類似于write_condition機(jī)制的其實(shí)都是提供的樂觀鎖。
(3)悲觀鎖 和 樂觀鎖的區(qū)別:
- 樂觀鎖在不發(fā)生取鎖失敗的情況下開銷比悲觀鎖小,但是一旦發(fā)生失敗回滾開銷則比較大,因此適合用在取鎖失敗概率比較小的場景,可以提升系統(tǒng)并發(fā)性能
- 樂觀鎖還適用于一些比較特殊的場景,例如在業(yè)務(wù)操作過程中無法和數(shù)據(jù)庫保持連接等悲觀鎖無法適用的地方
小結(jié):
MySQL表級鎖的鎖模式
MyISAM在執(zhí)行查詢語句(SELECT)前,會(huì)自動(dòng)給涉及的所有表加讀鎖,
在執(zhí)行更新操作(DML)前,會(huì)自動(dòng)給涉及的表加寫鎖。
所以對MyISAM表進(jìn)行操作,會(huì)有以下情況:
a、對MyISAM表的讀操作(加讀鎖),不會(huì)阻塞其他進(jìn)程(會(huì)話)對同一表的讀請求,
但會(huì)阻塞對同一表的寫請求。只有當(dāng)讀鎖釋放后,才會(huì)執(zhí)行其它進(jìn)程的寫操作。
b、對MyISAM表的寫操作(加寫鎖),會(huì)阻塞其他進(jìn)程(會(huì)話)對同一表的讀和寫操作,
只有當(dāng)寫鎖釋放后,才會(huì)執(zhí)行其它進(jìn)程的讀寫操作。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaowangbangzhu/p/10436848.html
總結(jié)
以上是生活随笔為你收集整理的MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android】动态更新Icon
- 下一篇: MySQL填充字符串函数 LPAD(st