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之死锁就这样结束吧!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment gérer les problèmes de blocage dans le développement C++ Le blocage est l'un des problèmes courants dans la programmation multithread, en particulier lors du développement en C++. Des problèmes de blocage peuvent survenir lorsque plusieurs threads attendent les ressources de chacun. S'il n'est pas traité à temps, un blocage entraînera non seulement le gel du programme, mais affectera également les performances et la stabilité du système. Par conséquent, il est très important d’apprendre à gérer les problèmes de blocage dans le développement C++. 1. Comprendre les causes des blocages. Pour résoudre le problème de blocage, vous devez d'abord comprendre les causes des blocages. Une impasse se produit généralement lorsque

Blocage et famine dans Go : prévenir et résoudre les blocages : les coroutines s'attendent les unes les autres et ne peuvent pas effectuer d'opérations. Utilisez la fonction runtime.SetBlockProfileRate pour détecter. Prévenir les blocages : utilisez un verrouillage précis, des délais d'attente et des structures de données sans verrouillage pour éviter les blocages. Famine : la coroutine continue d'être incapable d'obtenir des ressources et des verrous équitables sont utilisés pour éviter la famine. Pratique de verrouillage équitable : créez un verrou équitable et attendez que la coroutine tente d'acquérir le verrou le plus longtemps possible pour acquérir le verrou en premier.

Méthodes pour résoudre le problème de blocage dans le développement du langage Go Le langage Go est un langage compilé open source à typage statique qui est largement utilisé dans la programmation simultanée. Cependant, en raison des caractéristiques du modèle de concurrence du langage Go, les développeurs rencontrent souvent des problèmes de blocage lors de l'écriture de programmes concurrents. Cet article présentera quelques méthodes pour résoudre le problème de blocage dans le développement du langage Go. Premièrement, nous devons comprendre ce qu’est une impasse. Le blocage fait référence à une situation dans laquelle plusieurs tâches simultanées ne peuvent pas poursuivre leur exécution car elles attendent les unes les autres pour libérer des ressources. En langage Go, les problèmes de blocage sont généralement dus à la concurrence pour les ressources ou

Le mécanisme de prévention des blocages multithread comprend : 1. Séquence de verrouillage ; 2. Test et configuration. Le mécanisme de détection comprend : 1. Timeout ; 2. Détecteur de blocage. L'article prend l'exemple d'un compte bancaire partagé et évite les blocages grâce à une séquence de verrouillage. La fonction de transfert demande d'abord le verrouillage du compte de transfert sortant, puis le transfert du compte entrant.

Le blocage est une erreur courante dans la programmation simultanée qui se produit lorsque plusieurs threads attendent les verrous détenus les uns par les autres. Les blocages peuvent être résolus à l'aide d'un débogueur pour les détecter, analyser l'activité des threads et identifier les threads et les verrous impliqués. Les moyens de résoudre les blocages consistent notamment à éviter les dépendances circulaires, à utiliser des détecteurs de blocage et à utiliser des délais d'attente. En pratique, les blocages peuvent être évités en garantissant que les threads acquièrent les verrous dans le même ordre ou en utilisant des verrous récursifs ou des variables de condition.

Les raisons de l'impasse dans le système comprennent les conditions d'exclusion mutuelle, les conditions de demande et de maintien, les conditions d'inévitabilité et les conditions d'attente circulaire. Introduction détaillée : 1. Conditions mutuellement exclusives, plusieurs threads doivent accéder à certaines ressources partagées en même temps, et ces ressources ne peuvent être occupées que par un thread à la fois. Si un thread occupe une certaine ressource, les autres threads doivent attendre. ressource à libérer ; 2 , Conditions de demande et de maintien. Tant qu'un thread détient une certaine ressource, il demande également des ressources détenues par d'autres threads, si ces ressources sont occupées par d'autres threads, cela fera attendre le thread ; , etc.

Comment résoudre le problème de blocage en langage Go ? Le langage Go a les caractéristiques de la programmation simultanée, et des opérations simultanées peuvent être réalisées en utilisant goroutine et canal. Cependant, le blocage est un problème courant en programmation simultanée. Lorsque les goroutines dépendent les unes des autres et créent des dépendances circulaires lors de l'accès à ces ressources, des blocages peuvent survenir. Cet article explique comment résoudre le problème de blocage dans le langage Go et fournit des exemples de code spécifiques. Tout d’abord, comprenons ce que

Deadlock Il y a blocage lorsque plusieurs threads s'attendent mutuellement pour obtenir des ressources, formant une boucle qui finit par bloquer tous les threads. En Python, un blocage se produit généralement lorsque plusieurs verrous ou mutex sont verrouillés dans le mauvais ordre. Exemple : importthreading#Deux threads partagent deux verrous lock1=threading.Lock()lock2=threading.Lock()defthread1_func():lock1.acquire()lock2.acquire()#Effectuer certaines opérations lock2.release()lock1. )defthread2_func():loc
