Table des matières
列个场景
等待结局" >等待结局
假如这样呢" >假如这样呢
Maison base de données tutoriel mysql mysql之死锁_MySQL

mysql之死锁_MySQL

May 30, 2016 pm 05:10 PM
死锁

其实,看到“死锁”二字,不需要王二,就是我,来再废口舌,这两个字名如其意,已经可以透过现象看本质了。不过呢,我虽然长着一副程序猿的样子,但一直没有理解好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>
Copier après la connexion
<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>
Copier après la connexion

<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>
Copier après la connexion
<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>
Copier après la connexion

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment gérer les problèmes de blocage dans le développement C++ Comment gérer les problèmes de blocage dans le développement C++ Aug 22, 2023 pm 02:24 PM

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

Prévention et solution des blocages et de la famine dans le contrôle de concurrence des fonctions Golang Prévention et solution des blocages et de la famine dans le contrôle de concurrence des fonctions Golang Apr 24, 2024 pm 01:42 PM

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.

Comment résoudre l'impasse dans le développement Go Comment résoudre l'impasse dans le développement Go Jun 30, 2023 pm 04:58 PM

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

Mécanisme de prévention et de détection des blocages dans la programmation multithread C++ Mécanisme de prévention et de détection des blocages dans la programmation multithread C++ Jun 01, 2024 pm 08:32 PM

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.

Comment déboguer les blocages dans les programmes C++ ? Comment déboguer les blocages dans les programmes C++ ? Jun 03, 2024 pm 05:24 PM

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.

Quelles sont les raisons du blocage du système ? Quelles sont les raisons du blocage du système ? Sep 04, 2023 pm 02:44 PM

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 ? Comment résoudre le problème de blocage en langage Go ? Oct 08, 2023 pm 05:07 PM

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

Défis de programmation simultanée en Python : lutter contre les blocages et les conditions de concurrence Défis de programmation simultanée en Python : lutter contre les blocages et les conditions de concurrence Feb 19, 2024 pm 02:40 PM

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

See all articles