自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)庫篇:MySQL鎖詳解

數(shù)據(jù)庫 其他數(shù)據(jù)庫
mysql 在 repeatable read 隔離級(jí)別解決幻讀的,有兩種實(shí)現(xiàn)方式。一是靠 MVCC 方案解決;二是加鎖方案解決。

前言

sql事務(wù)的執(zhí)行,如果需要鎖定數(shù)據(jù)進(jìn)行更新操作,則必定離不開鎖。

  • 共享鎖和排他鎖
  • 表鎖
  • 行鎖 Record Lock
  • 間隙鎖 Gap Lock
  • 行鎖+間隙鎖 Next-Key Lock
  • 加鎖場(chǎng)景(加鎖sql)

1.共享鎖和排他鎖

排他鎖(X鎖),當(dāng)前事務(wù)給記錄上鎖后(insert update delete),可以進(jìn)行讀寫,其他事務(wù)不可以加任何鎖。

共享鎖(S鎖),是指當(dāng)前事務(wù)給一條記錄上鎖后,其他事務(wù)也可以給當(dāng)前記錄加共享鎖。共享鎖只用于鎖定讀,如需要更新數(shù)據(jù),是不允許的。

2.表鎖

針對(duì)數(shù)據(jù)庫表的鎖,又稱為表

  • 開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低
  • MySQL表級(jí)鎖有兩種模式:表共享鎖(Table Read Lock)和表獨(dú)占寫鎖(Table Write Lock)。
  • myisam,memory,merge 存儲(chǔ)引擎只支持表鎖。

表級(jí)別的 AUTO_INC 鎖

在為表某列添加 AUTO_INCREDMENT 屬性,之后插入數(shù)據(jù)時(shí)可以不指定該字段,系統(tǒng)會(huì)自動(dòng)為它賦值,此時(shí)獲取自增值是需要 AUTO_INC 鎖鎖定的。

3.行鎖 Record Lock

  • innodb 既支持表鎖也支持行鎖,行鎖是針對(duì)一行記錄的鎖。
  • 行鎖:開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
  • innodb 執(zhí)行 select update delete insert 語句是不會(huì)為表加 S 鎖和 X 鎖,因?yàn)楸礞i力度大,容易阻塞
  • 單條索引記錄上加鎖,record lock鎖住的永遠(yuǎn)是索引,而非記錄本身,即使該表上沒有任何索引,那么innodb會(huì)在后臺(tái)創(chuàng)建一個(gè)隱藏的聚集主鍵索引,那么鎖住的就是這個(gè)隱藏的聚集主鍵索引。所以說當(dāng)一條sql沒有走任何索引時(shí),那么將會(huì)在每一條聚集索引后面加X鎖。

何為意向鎖

如果存在行鎖的情況,想給表加鎖,怎么辦?遍歷查看表有沒有行鎖,太浪費(fèi)時(shí)間了。此時(shí)意向鎖登場(chǎng)啦!

  • 意向共享鎖(IS鎖):當(dāng)事務(wù)給某行記錄增加 S 鎖時(shí),同時(shí)給表加個(gè) IS 鎖。
  • 意向獨(dú)占鎖(IX鎖):當(dāng)事務(wù)給某行記錄增加 X 鎖時(shí),同時(shí)給表加個(gè) IX 鎖。

有了意向鎖,則不需要遍歷數(shù)據(jù)也可以直接判斷是否可以給表加鎖

4.間隙鎖 Gap Lock

mysql 在 repeatable read 隔離級(jí)別解決幻讀的,有兩種實(shí)現(xiàn)方式。一是靠 MVCC 方案解決;二是加鎖方案解決。然而在事務(wù)加鎖時(shí),記錄是不存在的,是無法加行鎖的。則需要靠間隙鎖(gap lock)實(shí)現(xiàn)。

  • 例如給 id=10 記錄加 gap 鎖,鎖住(5,10)區(qū)間。另一事務(wù)想插入 id=8 的記錄,會(huì)先定位到 id=10 的記錄,然后發(fā)現(xiàn)存在一個(gè) gap 鎖,則阻塞直到 第一個(gè)事務(wù)將 gap 鎖釋放掉,才可以在(5,10)區(qū)間插入記錄
  • gap lock 僅僅是為了防止插入幻影記錄,并不會(huì)限制其他事務(wù)對(duì)記錄繼續(xù)加行鎖 或者 gap 鎖。

5.行鎖+間隙鎖 Next-Key Lock

  • next-key鎖的本質(zhì)是 record lock 加一個(gè)gap lock的結(jié)合體。它既能保護(hù)該記錄,又能阻止別的事務(wù)將新的記錄插入被保護(hù)記錄的前面間隙中

6.加鎖場(chǎng)景(repeatable read 隔離級(jí)別加鎖 sql,忽略二級(jí)索引的加鎖操作)

  • 快照讀:讀的是數(shù)據(jù)庫記錄的快照版本,sql 執(zhí)行前和當(dāng)前事務(wù)ID生成的最新數(shù)據(jù)。
  • 當(dāng)前讀:讀取已提交事務(wù)生成的數(shù)據(jù),大于當(dāng)前事務(wù)ID的已提交事務(wù),其生成的數(shù)據(jù)也可以讀取。

select from

  • 不加任何鎖,快照讀。

select for update

  • 聚簇索引上加 X 鎖,當(dāng)前讀

select lock in share mode

  • 聚簇索引上加行級(jí) S 鎖,采用當(dāng)前讀。

insert、update 和 delete 語句的加鎖情況

  • insert 在可重復(fù)讀級(jí)別加的是 next-key lock
  • delete、update 是在聚簇索引記錄加上 X 鎖。
責(zé)任編輯:武曉燕 來源: 潛行前行
相關(guān)推薦

2011-07-05 10:03:00

Qt MYSQL 數(shù)據(jù)庫

2024-12-16 00:52:26

MySQL數(shù)據(jù)庫并發(fā)

2011-08-18 13:44:42

Oracle悲觀鎖樂觀鎖

2019-04-25 15:35:37

MySQL數(shù)據(jù)庫運(yùn)維Linux

2021-06-05 21:29:53

數(shù)據(jù)庫MySQL函數(shù)

2010-03-29 10:19:24

2010-06-07 13:30:15

2010-05-19 13:37:39

MySQL數(shù)據(jù)庫密碼

2011-08-30 12:51:19

MySQL線程緩沖池

2011-08-05 14:02:17

MySQL數(shù)據(jù)庫異常處理

2011-03-30 13:44:45

MySQL數(shù)據(jù)庫鎖機(jī)制

2022-05-09 15:52:23

MySQL數(shù)據(jù)庫數(shù)據(jù)庫表

2024-09-06 11:52:47

2009-12-31 11:10:01

2018-07-30 15:00:05

數(shù)據(jù)庫MySQLJOIN

2009-09-07 15:25:24

MySQL數(shù)據(jù)庫互操作Silverlight

2020-02-06 10:02:45

MySQL數(shù)據(jù)庫全局鎖

2011-03-07 17:02:07

2011-07-27 13:58:48

EclipseMySQL

2019-10-12 15:06:02

MySQL數(shù)據(jù)庫命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)