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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go のデッドロックと飢餓: デッドロックの防止と解決: コルーチンが相互に待機しているため、操作を実行できないことを検出するには、 runtime.SetBlockProfileRate 関数を使用します。デッドロックの防止: デッドロックを防止するには、きめ細かいロック、タイムアウト、およびロックフリーのデータ構造を使用します。飢餓: コルーチンは引き続きリソースを取得できず、飢餓を防ぐためにフェア ロックが使用されます。公平なロックの実践: 公平なロックを作成し、最初にロックを取得するためにコルーチンがロックを取得しようとするのを最長時間待機します。

C++ 開発におけるデッドロックの問題に対処する方法 デッドロックは、マルチスレッド プログラミング、特に C++ での開発でよく見られる問題の 1 つです。複数のスレッドが互いのリソースを待機すると、デッドロックの問題が発生することがあります。デッドロックが時間内に処理されないと、プログラムがフリーズするだけでなく、システムのパフォーマンスと安定性に影響を与えます。したがって、C++ 開発におけるデッドロック問題への対処方法を学ぶことは非常に重要です。 1. デッドロックの原因を理解する デッドロックの問題を解決するには、まずデッドロックの原因を理解する必要があります。デッドロックは通常、次のような場合に発生します。

Go 言語開発におけるデッドロック問題を解決する方法 Go 言語は、同時プログラミングで広く使用されているオープンソースの静的に型付けされたコンパイル言語です。ただし、Go 言語の同時実行モデルの特性により、開発者は同時実行プログラムを作成するときにデッドロックの問題に遭遇することがよくあります。この記事では、Go言語開発におけるデッドロック問題を解決する方法をいくつか紹介します。まず、デッドロックとは何かを理解する必要があります。デッドロックとは、複数の同時タスクが互いのリソースの解放を待っているために実行を続行できない状況を指します。 Go 言語では、デッドロックの問題は通常、リソースまたはリソースの競合が原因で発生します。

マルチスレッドのデッドロック防止メカニズムには次のものが含まれます。 1. ロック シーケンス。 2. テストとセットアップ。検出メカニズムには、1. タイムアウト、2. デッドロック検出器が含まれます。この記事では、共有銀行口座の例を取り上げ、ロック シーケンスによってデッドロックを回避します。転送機能は、まず送金口座のロックを要求し、次に口座への送金を要求します。

デッドロックは、複数のスレッドが互いに保持しているロックを待機するときに発生する、同時プログラミングにおける一般的なエラーです。デッドロックは、デバッガーを使用してデッドロックを検出し、スレッドのアクティビティを分析し、関係するスレッドとロックを特定することで解決できます。デッドロックを解決する方法には、循環依存関係の回避、デッドロック検出機能の使用、タイムアウトの使用などがあります。実際には、スレッドが同じ順序でロックを取得するようにするか、再帰的ロックや条件変数を使用することで、デッドロックを回避できます。

システムにおけるデッドロックの原因には、相互排他条件、要求および保留条件、必然性条件、および循環待機条件が含まれます。詳細な導入: 1. 相互に排他的な条件。複数のスレッドが特定の共有リソースに同時にアクセスする必要があり、これらのリソースを一度に占有できるのは 1 つのスレッドのみです。1 つのスレッドが特定のリソースを占有する場合、他のスレッドはそのリソースが占有されるまで待機する必要があります。解放されるリソース; 2、リクエストとホールドの条件 スレッドは、あるリソースを保持している間、他のスレッドが保持しているリソースも要求します 他のスレッドがリソースを占有している場合、スレッドは待機します; 3. 必然性の条件、など。

Go言語のデッドロック問題を解決するにはどうすればよいですか? Go言語は並列プログラミングの特徴があり、ゴルーチンやチャネルを利用することで並列処理を実現できます。ただし、デッドロックは同時プログラミングではよくある問題です。ゴルーチンが互いのリソースに依存しており、これらのリソースにアクセスするときに循環依存関係が作成されると、デッドロックが発生する可能性があります。この記事では、Go言語におけるデッドロック問題の解決方法と具体的なコード例を紹介します。まず、何を理解しましょう

デッドロック デッドロックとは、複数のスレッドがリソースを求めて互いに待機し、最終的にすべてのスレッドがブロックされるループを形成することです。 Python では、通常、複数のロックまたはミューテックスが間違った順序でロックされている場合にデッドロックが発生します。例: importthreading#2 つのスレッドが 2 つのロックを共有 lock1=threading.Lock()lock2=threading.Lock()defthread1_func():lock1.acquire()lock2.acquire()#いくつかの操作を行う lock2.release()lock1.release( )defthread2_func():loc
