Mysql-InnoDB 鎖機制及測試

Mysql-InnoDB 鎖機制與測試(20200401_20200404)

1. 死鎖

1.1 死鎖概念:

死鎖是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進下去.此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn) 生了死鎖,這些永遠在互相等待的進程稱為死鎖進程.表級鎖不會產(chǎn)生死鎖.所以解決死鎖主要還是針對于最常用的InnoDB

1.2 mysql處理死鎖的方式

  1. 等待泌参,直到超時(innodb_lock_wait_timeout=50s)憔四。
  2. 發(fā)起死鎖檢測,主動回滾一條事務(wù)惰赋,讓其他事務(wù)繼續(xù)執(zhí)行(innodb_deadlock_detect=on)炉菲。

1.3 死鎖檢測

死鎖檢測的原理是構(gòu)建一個以事務(wù)為頂點疲陕、鎖為邊的有向圖鞭盟,判斷有向圖是否存在環(huán),存在即有死鎖格二。

1.4 回滾機制

檢測到死鎖之后,選擇插入更新或者刪除的行數(shù)最少的事務(wù)回滾竣蹦,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來判斷顶猜。如果插入更新或者刪除的行數(shù)一樣則回滾后面執(zhí)行的那條事務(wù)。

1.5 測試表及數(shù)據(jù):下面不再展示

【p_transaction 表】

id  int(11) NO  PRI     auto_increment
count   int(11) YES         
version int(11) YES     0   
---
id  count   version
1   1   1
6   11  0
10  14  0
11  14  0
12  10  0
13  15  0
14  16  0
15  17  0
16  18  0
21  22  0
24  24  0
25  25  0
26  26  0
27  27  0
28  28  0
29  29  0
30  300 0
31  301 0

1.6 測試用例

-- 查看日志文件設(shè)置狀態(tài)
show variables like "%innodb_flush_log_at_trx_commit%";
-- 更改日志文件設(shè)置狀態(tài)
set @@global.innodb_flush_log_at_trx_commit = 0; -- 0痘括,1长窄,2

-- 鎖等待時間
show VARIABLES like "%innodb_lock_wait_timeout%";
-- 死鎖自動回滾
show VARIABLES like "%innodb_deadlock_detect%";

-- 死鎖測試
begin;
select * from p_transaction where id = 32 for update;
update p_transaction set count = 1 where id = 1;
insert into p_transaction (id, count) values (32, 300);
commit;
rollback;

2. MVCC 樂觀鎖

2.1 英文全稱為Multi-Version Concurrency Control,翻譯為中文即「多版本并發(fā)控制」滔吠。

MVCC使得InnoDB的事務(wù)隔離級別下執(zhí)行一致性讀操作有了保證,換言之挠日,就是 為了查詢一些正在被另一個事務(wù)更新的行疮绷, 并且可以看到它們被更新之前的值。這是一個可以用來增強并發(fā)性的強大的技術(shù)嚣潜,因為這樣一來的話查詢就不用等 待另一個事務(wù)釋放鎖冬骚。這項技術(shù)在數(shù)據(jù)庫領(lǐng)域并不是普遍使用的。一些其它的數(shù)據(jù)庫產(chǎn)品懂算, 以及mysql其它的存儲引擎并不支持它只冻。

2.2 mysql的innodb表除了實際的數(shù)據(jù)之外,還會加上3個隱藏的字段计技,如下:

實際數(shù)據(jù) | create_no(創(chuàng)建版本號或者創(chuàng)建時間) | update_no(每次修改的版本號或者修改時間) | delete_no(刪除版本號或者刪除時間)

  • insert:當(dāng)我們新增一條數(shù)據(jù)時喜德,這條數(shù)據(jù)會加上創(chuàng)建的版本號
  • update:修改當(dāng)前的字段,每修改一次數(shù)據(jù)垮媒,修改版本號都會依次增加一次
  • delete:刪除當(dāng)前的數(shù)據(jù)舍悯,其實并不會真實的刪除,他會先在刪除版本號字段記錄下刪除的版本號睡雇,在過了一段時間后會進行清除或者刷新

2.3 MVCC是樂觀鎖的一種實現(xiàn)方式萌衬,但并不是MVCC就等于樂觀鎖。

2.4 測試用例

-- 樂觀鎖測試
select count, version  from p_transaction where id = 1;
update p_transaction set count = count - 1,version = version + 1 where id = 1 and version = 0;

3. 樂觀鎖與悲觀鎖:樂觀鎖與悲觀鎖都屬于是一種思想入桂,而非實際的 mysql 鎖機制奄薇。

樂觀鎖:不使用鎖機制

悲觀鎖:只要使用了鎖機制都屬于悲觀鎖

3.1 測試用例

-- 悲觀鎖測試
begin;
select count from p_transaction where id = 1;
update p_transaction set count = count - 1 where id = 1;
commit;
rollback;

4. 間隙鎖

當(dāng)我們用范圍條件而不是相等條件檢索數(shù)據(jù),并請求共享或排他鎖時抗愁,InnoDB會給符合條件的已有數(shù)據(jù)記錄的索引項加鎖;對于鍵值在條件范圍內(nèi)但不存在的 記錄馁蒂,叫做“間隙(GAP)”,InnoDB也會對這個“間隙”加鎖蜘腌,這種鎖機制就是所謂的間隙鎖(NEXT-KEY)鎖沫屡。間隙鎖類次與頁級鎖,但是實際是行級鎖撮珠。

4.1 測試用例

-- 悲觀鎖測試
begin;
select count from p_transaction where id = 1;
update p_transaction set count = count - 1 where id = 1;
commit;
rollback;

5. 行級鎖升級為表級鎖

InnoDB 行級鎖是通過給索引上的索引項加鎖來實現(xiàn)的沮脖,InnoDB行級鎖只有通過索引條件檢索數(shù)據(jù),才使用行級鎖;否則芯急,InnoDB使用表鎖 在不通過索引(主 鍵)條件查詢的時候勺届,InnoDB是表鎖而不是行鎖。

5.1 測試用例

-- 間隙鎖測試
begin;
select * from p_transaction where id >=1 and id <= 10 for update;
select * from p_transaction where id between 1 and 10 for update;
-- 排它鎖
select * from p_transaction where id = 6 for update;
-- 共享鎖
select * from p_transaction where id = 6 lock in share mode;
-- 無鎖
select * from p_transaction where id = 6;
update p_transaction set count = 10 where id = 6;
update p_transaction set count = 10 where id = 12;
commit;
rollback;

6. 事務(wù)的使用建議

  1. 控制事務(wù)大小娶耍,減少鎖定的資源量和鎖定時間長度免姿。
  2. 人所有的數(shù)據(jù)檢索都通過索引來完成,從而避免因為無法通過索引加鎖而升級為表鎖榕酒。
  3. 減少基于范圍的數(shù)據(jù)檢索過濾條件胚膊,避免因為間隙鎖帶來的負面影響而鎖定了不該鎖定的數(shù)據(jù)故俐。
  4. 在業(yè)務(wù)條件允許下,盡量使用較低隔離級別的事務(wù)隔離紊婉。減少隔離級別帶來的附加成本药版。
  5. 合理使用索引,讓innodb在索引上面加鎖的時候更加準確喻犁。
  6. 在應(yīng)用中盡可能做到訪問的順序執(zhí)行
  7. 如果容易死鎖槽片,就可以考慮使用表鎖來減少死鎖的概率
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市株汉,隨后出現(xiàn)的幾起案子筐乳,更是在濱河造成了極大的恐慌,老刑警劉巖乔妈,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝙云,死亡現(xiàn)場離奇詭異,居然都是意外死亡路召,警方通過查閱死者的電腦和手機勃刨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來股淡,“玉大人身隐,你說我怎么就攤上這事∥椋” “怎么了贾铝?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長埠帕。 經(jīng)常有香客問我垢揩,道長,這世上最難降的妖魔是什么敛瓷? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任叁巨,我火速辦了婚禮,結(jié)果婚禮上呐籽,老公的妹妹穿的比我還像新娘锋勺。我一直安慰自己,他們只是感情好狡蝶,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布庶橱。 她就那樣靜靜地躺著,像睡著了一般贪惹。 火紅的嫁衣襯著肌膚如雪苏章。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天馍乙,我揣著相機與錄音布近,去河邊找鬼。 笑死丝格,一個胖子當(dāng)著我的面吹牛撑瞧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播显蝌,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼预伺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曼尊?” 一聲冷哼從身側(cè)響起酬诀,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骆撇,沒想到半個月后瞒御,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體神郊,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肴裙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年蜻懦,在試婚紗的時候發(fā)現(xiàn)自己被綠了夕晓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡征炼,死狀恐怖吁朦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雄右,我是刑警寧澤纺讲,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站逢渔,受9級特大地震影響乡括,放射性物質(zhì)發(fā)生泄漏智厌。R本人自食惡果不足惜盲赊,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哀蘑。 院中可真熱鬧,春花似錦合溺、人聲如沸缀台。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽依疼。三九已至,卻和暖如春膀值,著一層夾襖步出監(jiān)牢的瞬間误辑,已是汗流浹背沧踏。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工翘狱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砰苍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓茬缩,卻偏偏與公主長得像吼旧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掂为,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1 MySQL的三種鎖 1.1 表鎖 開銷小,加鎖快 不會出現(xiàn)死鎖 鎖定粒度大魂角,發(fā)生鎖沖突的概率最高智绸,并發(fā)度最低 ...
    JavaEdge閱讀 643評論 0 1
  • 作者:劉仁鵬參考資料: 《MySQL技術(shù)內(nèi)幕 InnoDB存儲引擎》 MySQL的并發(fā)控制與加鎖分析 1.基礎(chǔ)知識...
    agile4j閱讀 5,468評論 5 17
  • 索引 數(shù)據(jù)庫中的查詢操作非常普遍迹恐,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,886評論 0 8
  • 沒有任何防備卧斟,我啟動電腦發(fā)現(xiàn)桌面上只剩下了QQ殴边、回收站和網(wǎng)頁搜索珍语,第一時間想到的就是去買電腦的地方幫我把我消...
    我是愛寫作的慢慢閱讀 163評論 0 0
  • 今晚一個領(lǐng)導(dǎo)閑坐我辦公室板乙,閑聊時突然說:聽說你跟的那個老師是偷,別人說她有點不正常募逞,你怎么會喜歡她?放接! 哇,應(yīng)老師是我...
    曼呼吸閱讀 166評論 1 2