mysql之死锁_MySQL
其实,看到“死锁”二字,不需要王二,就是我,来再废口舌,这两个字名如其意,已经可以透过现象看本质了。不过呢,我虽然长着一副程序猿的样子,但一直没有理解好mysql的死锁概念,为此还曾苦恼过,觉得自己有愧于程序猿的脸面。有幸第N次拜读《高性能mysql》,恍惚间觉得自己明白了一些,也就是有点对得起程序猿这三个字了。
死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
看看人家说得多好,可我王二愣是不能够发自于肺腑的理解,在这条路上走了很多弯路。
列个场景
回到洛阳后,我一直做的是大宗期货交易项目,既然是交易,肯定涉及到数据的多并发,大宗期货交易的模式很复杂,说实话,我维护了整个项目的正常运作,但对于“买涨”、“买跌”都有可能赚钱的路数,还是不清楚,只能怪自己太迟钝。所以只好举个简单的例子了。
我有两个好朋友,一个叫王一,一个叫王三,一个芳龄十八(本来想年方二八呢,一想这年龄好像未成年,觉得不合适),一个芳龄29,一个如花似玉,一个风韵犹存。王二,也就是我,作为一个屌丝男,能够交到这两个异性朋友,真是托了程序员的福。
那天王一很苦恼,她不知道怎么把win7操作系统升级到win10,小青年都挺喜欢接受新东西,于是找到了我,丢给我一句:“猿兄,帮我忙呗,升级个操作系统!”“当然好啊,大哥我巴不得啊”,我心里这样想,但是强装淡定,于是回了句“恩,稍等,哥忙着呢。”不过最终我成功帮她升级了操作系统,这妹的,崇拜我得不行,于是就成为了朋友。 关于王三,算了,我再这么无耻的yy下去,你肯定要来打醒我了,就这样吧。
场景就是,算了,还是上sql吧,我y不下去了。
<code class="sql hljs ">START TRANSACTION; update girl SET age=18 where id=2; update girl set age=29 where id=1; COMMIT;</code>
<code class="sql hljs "><code class="sql hljs ">START TRANSACTION; UPDATE girl set age=19 where id=1; update girl set age=30 where id=2; commit;</code></code>
<code class="sql hljs ">如果凑巧,两个事务都执行了第一条update语句,分别修改了王一和王三的年纪,同时也锁定了改行语句,接着,每个事务都尝试执行第二条语句时,却发现该行已被对方锁定,然后两个事务都在等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。
<code class="sql hljs ">也就是说,逝水流年,王一和王三也逃不过时光的蹉跎,然而,在我心中,也就是王二的心中,却永远都不想他们老去,于是我和时光老人就干上了架,这会发生什么呢?
<code class="sql hljs ">等待结局
<code class="sql hljs ">时光老人 |
<code class="sql hljs ">王二 |
---|---|
<code class="sql hljs ">[SQL]START TRANSACTION;<br />
受影响的行: 0<br />
时间: 0.000s<br />
[SQL]UPDATE girl set age=19 where id=1;<br />
受影响的行: 0<br />
时间: 0.001s |
<code class="sql hljs ">[SQL]START TRANSACTION;<br />
受影响的行: 0<br />
时间: 0.000s<br />
[SQL]update girl SET age=18 where id=2;<br />
受影响的行: 1<br />
时间: 0.001s |
<code class="sql hljs ">[SQL]update girl set age=30 where id=2; |
<code class="sql hljs ">[SQL]update girl set age=29 where id=1;<br />
[Err] 1213 - Deadlock found when trying to get lock; try restarting transaction |
<code class="sql hljs ">innodb存储引擎,能检测到死锁的循环依赖,并立即返回一个错误。
<code class="sql hljs ">好吧,我还是干不过时光老人!
<code class="sql hljs ">假如这样呢
<code class="sql hljs ">故事到这里肯定是没有结束啊,我得想想办法,避免和时光老人发生冲突,于是就这样吧!
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">START TRANSACTION; UPDATE girl set age=19 where id=1; update girl set age=30 where id=2; commit;</code></code></code>
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">START TRANSACTION; update girl SET age=18 where id=1; update girl set age=29 where id=2; COMMIT;</code></code></code></code>
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">也就是说,在实战当中,假如我们遇到类似的问题,虽然innodb为我们做了错误的检测,但是我们还是要避免死锁的。
|
|
---|---|
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">[SQL]START TRANSACTION;<br>
受影响的行: 0<br>
时间: 0.037s<br>
<br>
[SQL]<br>
UPDATE girl set age=19 where id=1;<br>
受影响的行: 0<br>
时间: 0.001s |
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">[SQL]START TRANSACTION;<br>
受影响的行: 0<br>
时间: 0.001s<br>
<br>
[SQL]<br>
update girl SET age=18 where id=1; |
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">也就是说,在有这样的update时,尽量按照顺序来执行,避免冲突。当然了,情况不同,你如果不想这样,那就请不要相信我的鬼话,哈哈哈!
<code class="sql hljs "><code class="sql hljs "><code class="sql hljs ">好了,好了,mysql之死锁就这样结束吧!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何處理C++開發中的死鎖問題死鎖是多執行緒程式設計中常見的問題之一,尤其是在使用C++進行開發時更容易遇到。當多個執行緒互相等待對方持有的資源時,就可能發生死鎖問題。如果不及時處理,死鎖不僅會導致程式卡死,還會影響系統的效能和穩定性。因此,學習如何處理C++開發中的死鎖問題是非常重要的。一、理解死鎖的原因要解決死鎖問題,首先要了解死鎖產生的原因。死鎖通常發生在以

多執行緒死鎖預防機制包括:1.鎖順序;2.測試並設定。偵測機制包括:1.超時;2.死鎖偵測器。文章舉例共享銀行帳戶,透過鎖定順序避免死鎖,為轉帳函數先請求轉出帳戶再請求轉入帳戶的鎖。

死鎖是一種並發程式設計中的常見錯誤,發生在多個執行緒等待彼此持有的鎖時。可以透過使用調試器檢測死鎖,分析線程活動並識別涉及的線程和鎖,從而解決死鎖。解決死鎖的方法包括避免循環依賴、使用死鎖偵測器和使用逾時。在實踐中,透過確保執行緒以相同的順序取得鎖或使用遞歸鎖或條件變數可以避免死鎖。

Go中死鎖與飢餓:預防與解決死鎖:協程相互等待而無法進行的操作,使用runtime.SetBlockProfileRate函數偵測。預防死鎖:使用細粒度加鎖、逾時、無鎖定資料結構,防止死鎖。飢餓:協程持續無法取得資源,使用公平鎖防止飢餓。公平鎖實踐:創建公平鎖並等待協程嘗試獲取鎖的時間最長的優先獲取鎖。

解決Go語言開發中的死鎖問題的方法Go語言是一種開源的靜態類型編譯型語言,被廣泛應用於並發程式設計。然而,由於Go語言的並發模型的特性,開發者在編寫並發程式時常常會遇到死鎖問題。本文將介紹一些解決Go語言開發中死鎖問題的方法。首先,我們需要了解何為死鎖。死鎖是指多個並發任務因互相等待對方釋放資源而無法繼續執行的情況。在Go語言中,死鎖問題通常是由於對資源的競爭或

在C++中,使用互斥函數可以解決多執行緒並發程式設計中的死鎖問題。具體步驟如下:建立一個互斥量;當執行緒需要存取共享變數時,獲得互斥;修改共享變數;釋放互斥。這樣可以確保任何時刻只有一個執行緒存取共享變量,有效防止死鎖。

在Java並發程式設計中,可以透過避免和打破的方法來處理死鎖問題。避免死鎖的方法包括資源有序化、死鎖偵測和復原機制,以及避免循環等待;打破死鎖的方法包括執行緒中斷、鎖定降級和執行緒優先權調整。在實戰案例中,透過定義一個帳戶物件並使用synchronized關鍵字,可以避免死鎖,確保兩個執行緒以相同的順序取得鎖。

如何解決Go語言中的死鎖問題? Go語言具有並發程式設計的特性,可以透過使用goroutine和channel來實現並發操作。然而,在並發程式設計中,死鎖是一個常見的問題。當goroutine之間相互依賴彼此的資源,並且在存取這些資源時產生了循環依賴關係,就可能導致死鎖的發生。本文將介紹如何解決Go語言中的死鎖問題,並提供具體的程式碼範例。首先,讓我們來了解一下什麼是
