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),死鎖必定有兩把鎖。
最開(kā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是分開(kāi)的,
按預(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)證:
開(kāi)啟事務(wù)1:
執(zhí)行:sql2:UPDATE table set data = ‘123’ where id = 1;
執(zhí)行sql4:UPDATE table2 set data2 = ‘123’ where id = 1;
開(kāi)啟事務(wù)2:
執(zhí)行slq1:UPDATE table set data = ‘123’ where business_no = 'ABC';
開(kāi)啟事務(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)文章
SQL實(shí)現(xiàn)Excel的10個(gè)常用功能的示例詳解
SQL,數(shù)據(jù)分析崗的必備技能,你可以不懂Python,R,不懂可視化,不懂機(jī)器學(xué)習(xí)。但SQL,你必須懂。本文為大家總結(jié)了SQL實(shí)現(xiàn)Excel的10個(gè)常用功能的示例代碼,感興趣的可以了解一下2022-07-07
win8.1安裝mysql5.6時(shí)遇到問(wèn)題解決方案
本文主要記錄的是作者在win8.1安裝mysql5.6時(shí)遇到問(wèn)題的解決方案,網(wǎng)上查了很多方法都沒(méi)能解決,這里把最后的方法分享給大家2016-10-10
MySQL 有輸入輸出參數(shù)的存儲(chǔ)過(guò)程實(shí)例
MySQL 有輸入輸出參數(shù)的存儲(chǔ)過(guò)程實(shí)例2009-08-08
MySQL用truncate命令快速清空一個(gè)數(shù)據(jù)庫(kù)中的所有表
這篇文章主要介紹了MySQL用truncate命令快速清空一個(gè)數(shù)據(jù)庫(kù)中的所有表,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
MySQL中使用GROUP_CONCAT數(shù)據(jù)丟失的原因分析及解決過(guò)程
MySQL的GROUP_CONCAT函數(shù)可能因group_concat_max_len限制或字符集差異導(dǎo)致數(shù)據(jù)截?cái)?常見(jiàn)問(wèn)題在于返回的字符串長(zhǎng)度超出預(yù)期,解決方案包括調(diào)整group_concat_max_len、考慮分頁(yè)處理或在應(yīng)用層處理,確保數(shù)據(jù)完整傳輸2025-09-09

