最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何解決Mysql報(bào)錯Deadlock found when trying to get lock;try restarting transaction問題

 更新時(shí)間:2024年05月29日 11:32:24   作者:從百草園殺到三味書屋&  
這篇文章主要介紹了如何解決Mysql報(bào)錯Deadlock found when trying to get lock;try restarting transaction問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

問題發(fā)生場景

記錄一下最近項(xiàng)目中遇到的一個(gè)問題,前幾天在部署項(xiàng)目后,在線上運(yùn)行過程中,突然報(bào)了入下這樣的錯誤,從報(bào)錯信息中我們可以看到,是mysql在執(zhí)行update操作的時(shí)候報(bào)了一個(gè)死鎖的問題,今天解決了,特此記錄一下。

Mysql鎖類型分析

MySQL有三種鎖的級別:頁級、表級、行級,這個(gè)地方我遇到的問題是來自于行級鎖,所以重點(diǎn)說一下。

類型特性
表級鎖 (table-level locking)開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
行級鎖 (row-level locking)開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
頁面鎖 (page-level locking)開銷和加鎖時(shí)間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。

行級鎖在使用的時(shí)候并不是直接鎖掉這行記錄,而是鎖索引

  • 如果一條sql用到了主鍵索引(mysql主鍵自帶索引),mysql會鎖住主鍵索引;
  • 如果一條sql操作了非主鍵索引,mysql會先鎖住非主鍵索引,再鎖定主鍵索引.

死鎖原理

mysql的兩種鎖排它鎖(X鎖)和共享鎖(S鎖)(mysql還有其他鎖,需要了解可以自己去查,這個(gè)地方列舉兩個(gè)):

  • X鎖,是事務(wù)T對數(shù)據(jù)A加上X鎖時(shí),只允許事務(wù)T讀取和修改數(shù)據(jù)A,別的事務(wù)就沒辦法讀取和修改,所以也叫排它鎖,是互斥的
  • S鎖,是事務(wù)T對數(shù)據(jù)A加上S鎖時(shí),其他事務(wù)只能再對數(shù)據(jù)A加S鎖,而不能加X鎖,直到T釋放A上的S鎖,別的事務(wù)也用加S鎖,所以也叫共享鎖,是不互斥的

一般造成死鎖的原因是因?yàn)閮蓚€(gè)事物添加鎖的時(shí)候沒能及時(shí)的解鎖釋放資源,等到第二個(gè)事務(wù)要添加鎖的時(shí)候發(fā)現(xiàn)已經(jīng)被鎖,從而造成環(huán)路等待,構(gòu)成死鎖條件。

問題排查過程

通過上面log日志中的報(bào)錯信息,能很快確認(rèn)報(bào)錯的準(zhǔn)確位置

這個(gè)地方是執(zhí)行了一個(gè)update的操作,我找到了了這個(gè)表,看了一下這個(gè)表的索引是有三個(gè),兩個(gè)非主鍵索引,一個(gè)主鍵索引.

果然,在圖中這兩條索引在那個(gè)update語句中都有進(jìn)行的操作,具體如下:

然后我又找了一下有可能會跟這條語句發(fā)生沖突的地方,果然在這個(gè)報(bào)錯信息的上面,執(zhí)行了一條這樣的sql,這兩條sql執(zhí)行的間隔僅僅不超過1毫秒

根據(jù)上面所說的,如果一條sql用到了主鍵索引(mysql主鍵自帶索引),mysql會鎖住主鍵索引;

如果一條sql操作了非主鍵索引,mysql會先鎖住非主鍵索引,再鎖定主鍵索引.

因此sql(2)在使用的時(shí)候用到了schedu_id這個(gè)非主鍵索引,還需要鎖定主鍵索引,然而此時(shí)sql(1)開始執(zhí)行

然后鎖定了主鍵索引,但是在set操作中還用到了schedu_id這個(gè)非主鍵索引,但是這個(gè)索引在sql(1)執(zhí)行的時(shí)候還在處于被鎖的狀態(tài),因此兩條sql就出現(xiàn)了對索引資源的競爭,造成了死鎖.

問題原因

我的事務(wù)1中update wc_examine會多很多個(gè)update,這里有N行記錄被鎖定,事務(wù)的更新大量數(shù)據(jù)時(shí)間比較長,更新會加x鎖,而此時(shí)事務(wù)2是UPDATE wc_examine ,在update之前先執(zhí)行了select 操作,添加了S鎖,然后想要update的時(shí)候添加X鎖。

事務(wù)1的X鎖正準(zhǔn)備加上還是還沒加上,實(shí)際是存在X鎖,但是事務(wù)2加了s鎖,事務(wù)1會等待事務(wù)2的s鎖 事務(wù)2的完整事務(wù)加了s鎖立即就要加x鎖,但是事務(wù)1的x鎖沒有釋放。造成了環(huán)路等待。

解決方法

這個(gè)地方,代碼的問題需要根據(jù)情況自己去修改,可以試著把索引去掉(有風(fēng)險(xiǎn)),或者在進(jìn)行update的時(shí)候盡量避開非主鍵索引,我這里記錄一下被鎖后應(yīng)該怎么去解決的方法,首先先用sql查詢一下mysql的事務(wù)處理表

select * from information_schema.INNODB_TRX  

正常情況下的狀態(tài)都是RUNNING,但是在被鎖之后就會變成LOCK WAIT ,一旦出現(xiàn)這種情況,就得殺死這個(gè)進(jìn)程,如果進(jìn)程殺不死就只能重啟Mysql服務(wù)了

殺死進(jìn)程

kill 進(jìn)程ID

然后系統(tǒng)就能繼續(xù)運(yùn)行了

經(jīng)驗(yàn)教訓(xùn)

無論前臺后臺的程序,都不應(yīng)該存在僅根據(jù)非主鍵的幾個(gè)字段一查就要update/delete的場景。

即使有,也應(yīng)該改為先把要更新的記錄查出來然后逐條按主鍵id更新。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問題的方法

    解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問題的方法

    這篇文章主要為大家詳細(xì)介紹了解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問題的方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • MySQL使用外鍵實(shí)現(xiàn)級聯(lián)刪除與更新的方法

    MySQL使用外鍵實(shí)現(xiàn)級聯(lián)刪除與更新的方法

    這篇文章主要介紹了MySQL使用外鍵實(shí)現(xiàn)級聯(lián)刪除與更新的方法,詳細(xì)分析了mysql數(shù)據(jù)庫與表的創(chuàng)建、數(shù)據(jù)插入、查詢以及外鏈的使用與級聯(lián)操作相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • MySql 字符串中提取數(shù)字的實(shí)現(xiàn)示例

    MySql 字符串中提取數(shù)字的實(shí)現(xiàn)示例

    在MySQL中,有時(shí)需要從字符串中提取數(shù)字,本文就來介紹一下MySql 字符串中提取數(shù)字的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 淺談MySQL和Lucene索引的對比分析

    淺談MySQL和Lucene索引的對比分析

    下面小編就為大家?guī)硪黄狹ySQL和Lucene索引的對比分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • 如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog

    如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog

    這篇文章主要介紹了如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-02-02
  • MySQL?強(qiáng)制使用特定索引的操作

    MySQL?強(qiáng)制使用特定索引的操作

    MySQL可通過FORCEINDEX、USEINDEX等語法強(qiáng)制查詢使用特定索引,但優(yōu)化器可能不采納,需結(jié)合EXPLAIN分析執(zhí)行計(jì)劃,避免性能下降,注意版本差異,建議優(yōu)化索引結(jié)構(gòu)而非強(qiáng)制使用,本文介紹MySQL?強(qiáng)制使用特定索引的操作,感興趣的朋友一起看看吧
    2025-07-07
  • 如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程

    如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程

    這篇文章主要介紹了如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • mysql數(shù)據(jù)校驗(yàn)過程中的字符集問題處理

    mysql數(shù)據(jù)校驗(yàn)過程中的字符集問題處理

    在日常應(yīng)用中,我們經(jīng)常會遇到在不同的字符集的數(shù)據(jù)庫直接進(jìn)行數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,針對這個(gè)問題,我們來進(jìn)行討論下
    2014-05-05
  • MySQL數(shù)據(jù)庫遷移實(shí)戰(zhàn)

    MySQL數(shù)據(jù)庫遷移實(shí)戰(zhàn)

    數(shù)據(jù)庫遷移是指將一個(gè)數(shù)據(jù)庫從一種系統(tǒng)轉(zhuǎn)移到另一種系統(tǒng)或從一臺服務(wù)器遷移到另一臺服務(wù)器的過程,本文主要介紹了MySQL數(shù)據(jù)庫遷移實(shí)戰(zhàn),感興趣的可以了解一下
    2023-11-11
  • 銀河麒麟V10?x86安裝MySQL?8.0超詳細(xì)步驟記錄

    銀河麒麟V10?x86安裝MySQL?8.0超詳細(xì)步驟記錄

    MySQL廣泛用于Web應(yīng)用程序的后端數(shù)據(jù)庫存儲,因?yàn)樗且粋€(gè)快速、穩(wěn)定、可靠且易于使用的數(shù)據(jù)庫系統(tǒng),下面這篇文章主要介紹了銀河麒麟V10 x86安裝MySQL 8.0超詳細(xì)步驟的相關(guān)資料,需要的朋友可以參考下
    2026-04-04

最新評論

内江市| 乌鲁木齐县| 砚山县| 玉环县| 扶绥县| 怀来县| 韩城市| 和平区| 哈密市| 伽师县| 青冈县| 岳阳县| 杭州市| 晋州市| 盐津县| 禹州市| 巴彦淖尔市| 云安县| 克什克腾旗| 施秉县| 庆元县| 土默特右旗| 黄浦区| 沙洋县| 波密县| 凤庆县| 河源市| 裕民县| 霍林郭勒市| 霸州市| 常山县| 湖南省| 响水县| 微博| 迁安市| 那曲县| 边坝县| 吴川市| 奉化市| 舟曲县| 桃江县|