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

MySQL死鎖使用詳解及檢測和避免方法

 更新時間:2022年07月11日 09:43:12   作者:向著百萬年薪努力的小趙  
這篇文章主要介紹了MySQL死鎖使用詳解及檢測和避免方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

上一篇博客我們知道的Mysql事務(wù)的隔離機(jī)制和實現(xiàn),以及鎖的詳細(xì)解析

鏈接: MySQL臟讀幻讀不可重復(fù)讀及事務(wù)的隔離級別和MVCC、LBCC實現(xiàn)

在我們使用鎖的時候,有一個問題是需要注意和避免的,我們知道,排它鎖有互斥的特性。一個事務(wù)或者說一個線程持有鎖的時候,會阻止其他的線程獲取鎖,這個時候會造成阻塞等待,如果循環(huán)等待,會有可能造成死鎖。

這個問題我們需要從幾個方面來分析,一個是鎖為什么不釋放,第二個是被阻塞了怎么辦,第三個死鎖是怎么發(fā)生的,怎么避免。

鎖的釋放與阻塞

回顧:鎖什么時候釋放?
事務(wù)結(jié)束(commit,rollback)﹔
客戶端連接斷開。

如果一個事務(wù)一直未釋放鎖,其他事務(wù)會被阻塞多久?會不會永遠(yuǎn)等待下去?
如果是,在并發(fā)訪問比較高的情況下,如果大量事務(wù)因無法立即獲得所需的鎖而掛起,會占用大量計算機(jī)資源,造成嚴(yán)重性能問題,甚至拖跨數(shù)據(jù)庫。

線上怕不怕這個錯?

[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

MySQL有一個參數(shù)來控制獲取鎖的等待時間,默認(rèn)是50秒。

show VARIABLES like "innodb_lock_wait_timeout";

對于死鎖,是無論等多久都不能獲取到鎖的,這種情況,也需要等待50秒鐘嗎?那不是白白浪費了50秒鐘的時間嗎?

死鎖的發(fā)生和檢測

演示一下,開兩個會話:

方便對時間線的提現(xiàn),這里用圖片,有興趣的可以跟著模仿一下

栗子一:

栗子二:

在第一個事務(wù)中,檢測到了死鎖,馬上退出了,第二個事務(wù)獲得了鎖,不需要等待50秒:

[Err] 1213 - Deadlock found when trying to get lock; try restarting transaction

為什么可以直接檢測到呢?是因為死鎖的發(fā)生需要滿足一定的條件,對于我們程序員來說,有明確的條件,意味著能判定,所以在發(fā)生死鎖時,InnoDB一般都能通過算法(wait-for graph)自動檢測到。

那么死鎖需要滿足什么條件?死鎖的產(chǎn)生條件,因為鎖本身是互斥的:

  • (1)同一時刻只能有一個事務(wù)持有這把鎖;
  • (2)其他的事務(wù)需要在這個事務(wù)釋放鎖之后才能獲取鎖,而不可以強行剝奪;
  • (3)當(dāng)多個事務(wù)形成等待環(huán)路的時候,即發(fā)生死鎖。

理發(fā)店有兩個總監(jiān)。一個負(fù)責(zé)剪頭的Tony老師,一個負(fù)責(zé)洗頭的Kelvin老師。Tony老師不能同時給兩個人剪頭,這個就叫互斥。

Tony在給別人在剪頭的時候,你不能讓他停下來幫你剪頭,這個叫不能強行剝奪。
如果Tony的客戶對Kelvin說:你不幫我洗頭我怎么剪頭? Kelvin 的客戶對Tony說:你不幫我剪頭我怎么洗頭?這個就叫形成等待環(huán)路
實際上,發(fā)生死鎖的情況非常多,但是都滿足以上3個條件。
這個也是表鎖是不會發(fā)生死鎖的原因,因為表鎖的資源都是一次性獲取的。

如果鎖一直沒有釋放,就有可能造成大量阻塞或者發(fā)生死鎖,造成系統(tǒng)吞吐量下降,這時候就要查看是哪些事務(wù)持有了鎖。

查看鎖信息(日志)

首先,SHow STATUS命令中,包括了一些行鎖的信息:

show status like 'innodb_row_lock_%';

lnnodb_row_lock_current_waits:當(dāng)前正在等待鎖定的數(shù)量;
lnnodb_row_lock_time :從系統(tǒng)啟動到現(xiàn)在鎖定的總時間長度,單位ms;
Innodb_row_lock_time_avg :每次等待所花平均時間;
Innodb_row_lock_time_max:從系統(tǒng)啟動到現(xiàn)在等待最長的一次所花的時間;
lnnodb_row_lock_waits :從系統(tǒng)啟動到現(xiàn)在總共等待的次數(shù)。

SHOW命令是一個概要信息。InnoDB還提供了三張表來分析事務(wù)與鎖的情況:

select * from information_schema.INNODB_TRX; --當(dāng)前運行的所有事務(wù)﹐還有具體的語句

select* from information_schema.INNODB_LOCKS; --當(dāng)前出現(xiàn)的鎖

select * from information_schema.INNODB_LOCK_WAITS; --鎖等待的對應(yīng)關(guān)系

更加詳細(xì)的鎖信息,開啟標(biāo)準(zhǔn)監(jiān)控和鎖監(jiān)控:

額外的監(jiān)控肯定會消耗額外的性能

set GLOBAL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;

通過分析鎖日志,找出持有鎖的事務(wù)之后呢?
如果一個事務(wù)長時間持有鎖不釋放,可以kill事務(wù)對應(yīng)的線程ID,也就是INNODB_TRX表中的trx_mysql_thread_id,例如執(zhí)行kill 4,kill 7, kill 8。
當(dāng)然,死鎖的問題不能每次都靠kill線程來解決,這是治標(biāo)不治本的行為。我們應(yīng)該盡量在應(yīng)用端,也就是在編碼的過程中避免。
有哪些可以避免死鎖的方法呢?

死鎖的避免

  • 1、在程序中,操作多張表時,盡量以相同的順序來訪問(避免形成等待環(huán)路)
  • 2、批量操作單張表數(shù)據(jù)的時候,先對數(shù)據(jù)進(jìn)行排序(避免形成等待環(huán)路);
  • 3、申請足夠級別的鎖,如果要操作數(shù)據(jù),就申請排它鎖;
  • 4、盡量使用索引訪問數(shù)據(jù),避免沒有where條件的操作,避免鎖表;
  • 5、如果可以,大事務(wù)化成小事務(wù);
  • 6、使用等值查詢而不是范圍查詢查詢數(shù)據(jù),命中記錄,避免間隙鎖對并發(fā)的影響。

到此這篇關(guān)于MySQL死鎖使用詳解及檢測和避免方法的文章就介紹到這了,更多相關(guān)MySQL死鎖 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫教程

    Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫教程

    大家好,本篇文章主要講的是Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫教程,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • DBeaver連接MySQL的超詳細(xì)步驟

    DBeaver連接MySQL的超詳細(xì)步驟

    DBeaver是免費、開源、通用數(shù)據(jù)庫工具,是許多開發(fā)開發(fā)人員和數(shù)據(jù)庫管理員的所選,下面這篇文章主要給大家介紹了關(guān)于DBeaver連接MySQL的超詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • mysql中的跨庫關(guān)聯(lián)查詢方法

    mysql中的跨庫關(guān)聯(lián)查詢方法

    這篇文章主要介紹了mysql中的跨庫關(guān)聯(lián)查詢方法,需要的朋友可以參考下
    2017-05-05
  • MySQL數(shù)據(jù)庫改名的三種實現(xiàn)方式

    MySQL數(shù)據(jù)庫改名的三種實現(xiàn)方式

    這篇文章主要介紹了MySQL數(shù)據(jù)庫改名的三種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • mysql允許所有host訪問的方法

    mysql允許所有host訪問的方法

    下面小編就為大家?guī)硪黄猰ysql允許所有host訪問的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • mysql創(chuàng)建表設(shè)置表主鍵id從1開始自增的解決方案

    mysql創(chuàng)建表設(shè)置表主鍵id從1開始自增的解決方案

    在MySQL中用很多類型的自增ID,每個自增ID都設(shè)置了初始值,一般情況下初始值都是從0開始,然后按照一定的步長增加(一般是自增 1),下面這篇文章主要給大家介紹了關(guān)于mysql創(chuàng)建表設(shè)置表主鍵id從1開始自增的解決方案,需要的朋友可以參考下
    2023-04-04
  • MySQL的Query Cache圖文詳解

    MySQL的Query Cache圖文詳解

    Query Cache就是把查詢返回的結(jié)果緩存起來,但是,僅僅只是緩存查詢返回的結(jié)果,其實是不準(zhǔn)確的,Query Cache還會緩存查詢語句,在內(nèi)存中將查詢語句和查詢返回的結(jié)果映射起來
    2021-07-07
  • Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小

    Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小

    許多數(shù)據(jù)庫的元數(shù)據(jù)都是存儲在mysql中的,本文主要介紹了Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • mysql中錯誤:1093-You can’t specify target table for update in FROM clause的解決方法

    mysql中錯誤:1093-You can’t specify target table for update in F

    最近在工作中遇到了一個mysql錯誤提示1093:You can’t specify target table for update in FROM clause,后來通過查找相關(guān)的資料解決了這個問題,現(xiàn)在將解決的方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • MySQL中從庫延遲狀況排查的一則案例

    MySQL中從庫延遲狀況排查的一則案例

    這篇文章主要介紹了MySQL中從庫延遲狀況排查的一則案例,針對其從庫無業(yè)務(wù)狀態(tài)下的CPU大量占用情況,需要的朋友可以參考下
    2015-05-05

最新評論

肥城市| 博客| 襄垣县| 永康市| 微博| 新竹市| 大方县| 礼泉县| 行唐县| 亳州市| 遂川县| 仪征市| 荥阳市| 张家界市| 娄底市| 商水县| 沂水县| 宝应县| 永清县| 梧州市| 蒙城县| 称多县| 韩城市| 耒阳市| 巴彦县| 班玛县| 瑞安市| 横山县| 淮阳县| 楚雄市| 滁州市| 临桂县| 霍州市| 临清市| 南江县| 梨树县| 上蔡县| 汕尾市| 桐庐县| 竹山县| 夹江县|