MYSQL 根據(jù)唯一索引鍵更新死鎖問(wèn)題解析
mysql 死鎖問(wèn)題及死鎖權(quán)重分析
問(wèn)題發(fā)生過(guò)程:
1、生產(chǎn)發(fā)現(xiàn)死鎖一次
語(yǔ)句為sql1:UPDATE table set data = ‘123’ where business_no = 'ABC';
該行數(shù)據(jù)的id=1, business_no = 'ABC'
tablbe 字段
id:主鍵 business_no為唯一索引字段,其他字段暫時(shí)無(wú)意義
2、查找發(fā)生死鎖問(wèn)題原因
上述sql在一個(gè)事務(wù)內(nèi),死鎖必定有兩把鎖。
最開始對(duì)鎖的理解就是鎖主鍵、不清楚是否有其他鎖參與。
網(wǎng)上搜索發(fā)現(xiàn)update的where條件為唯一索引時(shí)候,sql會(huì)同時(shí)獲取兩把鎖,先獲取唯一索引business_no的鎖,再獲取主鍵id的鎖,所以必定同一時(shí)刻有先獲取id鎖,再獲取唯一主鍵鎖的sql。
查找代碼返現(xiàn)同一時(shí)刻,另外一個(gè)事務(wù)2執(zhí)行了以下sql
sql2:UPDATE table set data = ‘123’ where id = 1;
sql3:UPDATE table set data = ‘123’ where business_no = ‘ABC’;
現(xiàn)在發(fā)現(xiàn)了死鎖原因:
但是現(xiàn)象不復(fù)核預(yù)期
sql 1 先唯一鍵鎖、后 主鍵鎖
sql2 先主鍵鎖 、sql3后唯一鍵鎖
理論是sql1 和 sql3 都有可能發(fā)生死鎖,因?yàn)閟q1在一個(gè)sql內(nèi),sql2、slq3是分開的,
按預(yù)期sql3發(fā)生死鎖錯(cuò)誤的概率最大,但是代碼發(fā)生了8次死鎖全部是sql1發(fā)生了死鎖。
3、為啥sql1發(fā)生死鎖
第一步懷疑有其他sql參與了,但是沒(méi)找到疑點(diǎn)sql。
網(wǎng)上搜索發(fā)現(xiàn)了一個(gè)死鎖權(quán)重的概念。
大概意思是發(fā)生死鎖根據(jù)算法確定權(quán)重,權(quán)重小的事務(wù)會(huì)回滾。
感覺(jué)問(wèn)題快找到了,猜想sql1事務(wù)內(nèi)只有一個(gè)事務(wù)(他基本就是小權(quán)重的事務(wù))。
那接下來(lái)分析日志驗(yàn)證:
事務(wù)2還執(zhí)行了以下sql。
sql4:UPDATE table2 set data2 = ‘123’ where id = 1;
在sql2和sql3之前還有sql4。
那猜測(cè)有事務(wù)4 中sql5 UPDATE table2 set data2 = ‘345’ where id = 1;
讓后搜索日志發(fā)現(xiàn)同一時(shí)間有有sql5。
接下來(lái)實(shí)際驗(yàn)證:
開啟事務(wù)1:
執(zhí)行:sql2:UPDATE table set data = ‘123’ where id = 1;
執(zhí)行sql4:UPDATE table2 set data2 = ‘123’ where id = 1;
開啟事務(wù)2:
執(zhí)行slq1:UPDATE table set data = ‘123’ where business_no = 'ABC';
開啟事務(wù)3:
執(zhí)行sql5:UPDATE table2 set data2 = ‘345’ where id = 1;
事務(wù)1:
執(zhí)行slq3:UPDATE table set data = ‘123’ where business_no = ‘ABC’;
發(fā)現(xiàn)必sql1必死鎖異常且回滾,問(wèn)題解決。
4、問(wèn)題總結(jié)
msql行級(jí)鎖加鎖的過(guò)程。
mysql發(fā)生死鎖回滾的機(jī)制。
到此這篇關(guān)于MYSQL 根據(jù)唯一索引鍵更新死鎖問(wèn)題的文章就介紹到這了,更多相關(guān)mysql唯一索引鍵更新死鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析
這篇文章主要介紹了MySql中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建
索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個(gè)組成部分),它們包含著對(duì)數(shù)據(jù)表里所有記錄的引用指針。這篇文章主要介紹了詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建,有興趣的可以了解一下。2016-11-11mysql?count?為null時(shí),顯示0的問(wèn)題
這篇文章主要介紹了mysql?count?為null時(shí),顯示0的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲(chǔ)過(guò)程的方法
這篇文章主要介紹了在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲(chǔ)過(guò)程的方法,在一定程度上簡(jiǎn)化了操作,需要的朋友可以參考下2015-06-06Mysql中的日期時(shí)間函數(shù)小結(jié)
本文主要介紹了Mysql中的日期時(shí)間函數(shù)小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01php后臺(tái)經(jīng)常提示無(wú)法連接mysql 刷新后又可以訪問(wèn)的解決方法
這幾天有一臺(tái)MySQL數(shù)據(jù)庫(kù)服務(wù)器出現(xiàn)了頻繁的掉線情況,通過(guò)排查,并沒(méi)有排查出哪個(gè)網(wǎng)站被攻擊,百思不得其解中的時(shí)候,群里有個(gè)朋友說(shuō)是因?yàn)槲④汯B967723造成的,網(wǎng)上搜索了一下,果然很多人都是這樣的問(wèn)題,都是windows系統(tǒng)下安裝的MySQL造成的2011-05-05服務(wù)器上的mysql實(shí)現(xiàn)讀取sql文件
這篇文章主要介紹了服務(wù)器上的mysql實(shí)現(xiàn)讀取sql文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03安裝配置mysql及Navicat prenium的詳細(xì)流程
這篇文章主要介紹了安裝配置mysql及Navicat Premium的詳細(xì)流程,配置方法也真的很簡(jiǎn)單,本文給大家詳細(xì)介紹mysql Navicat Premium安裝配置相關(guān)知識(shí)感興趣的朋友,一起學(xué)習(xí)吧2021-06-06