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

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

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

問題發(fā)生場(chǎng)景

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

Mysql鎖類型分析

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

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

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

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

死鎖原理

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

  • X鎖,是事務(wù)T對(duì)數(shù)據(jù)A加上X鎖時(shí),只允許事務(wù)T讀取和修改數(shù)據(jù)A,別的事務(wù)就沒辦法讀取和修改,所以也叫排它鎖,是互斥的
  • S鎖,是事務(wù)T對(duì)數(shù)據(jù)A加上S鎖時(shí),其他事務(wù)只能再對(duì)數(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)錯(cuò)信息,能很快確認(rèn)報(bào)錯(cuò)的準(zhǔn)確位置

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

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

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

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

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

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

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

問題原因

我的事務(wù)1中update wc_examine會(huì)多很多個(gè)update,這里有N行記錄被鎖定,事務(wù)的更新大量數(shù)據(jù)時(shí)間比較長,更新會(huì)加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會(huì)等待事務(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,但是在被鎖之后就會(huì)變成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)

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

即使有,也應(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)級(jí)聯(lián)刪除與更新的方法

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

    這篇文章主要介紹了MySQL使用外鍵實(shí)現(xiàn)級(jí)聯(lián)刪除與更新的方法,詳細(xì)分析了mysql數(shù)據(jù)庫與表的創(chuàng)建、數(shù)據(jù)插入、查詢以及外鏈的使用與級(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索引的對(duì)比分析

    淺談MySQL和Lucene索引的對(duì)比分析

    下面小編就為大家?guī)硪黄狹ySQL和Lucene索引的對(duì)比分析。小編覺得挺不錯(cuò)的,現(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)常會(huì)遇到在不同的字符集的數(shù)據(jù)庫直接進(jìn)行數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,針對(duì)這個(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)或從一臺(tái)服務(wù)器遷移到另一臺(tái)服務(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ù)庫存儲(chǔ),因?yàn)樗且粋€(gè)快速、穩(wěn)定、可靠且易于使用的數(shù)據(jù)庫系統(tǒng),下面這篇文章主要介紹了銀河麒麟V10 x86安裝MySQL 8.0超詳細(xì)步驟的相關(guān)資料,需要的朋友可以參考下
    2026-04-04

最新評(píng)論

石楼县| 旌德县| 嵊泗县| 彭泽县| 来凤县| 大方县| 万州区| 吉隆县| 信宜市| 大英县| 新乡市| 土默特左旗| 玛沁县| 开江县| 拜泉县| 游戏| 林西县| 定西市| 北川| 荥阳市| 特克斯县| 长海县| 海口市| 白山市| 尼木县| 遂溪县| 紫云| 新化县| 博客| 商水县| 清水河县| 北海市| 义乌市| 云安县| 十堰市| 太原市| 上杭县| 内江市| 塔城市| 邓州市| 新营市|