巧用MySQL InnoDB引擎锁机制解决死锁问题_MySQL
案例如下:
在使用Show innodb status检查引擎状态时,发现了死锁问题:
*** (1) TRANSACTION:
TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 320
MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833455 lock_mode X locks rec but not gap waiting
Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
*** (2) TRANSACTION:
TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499
mysql tables in use 1, locked 1
3 lock struct(s), heap size 320, undo log entries 1
MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating
update TSK_TASK set STATUS_ID=1067,UPDATE_TIME=now () where ID in (9921180)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833454 lock_mode X locks rec but not gap
Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 843102 n bits 600 index `KEY_TSKTASK_MONTIME2` of table `dcnet_db/TSK_TASK` trx id 0 677833454 lock_mode X locks rec but not gap waiting
Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;
*** WE ROLL BACK TRANSACTION (1)
此死锁问题涉及TSK_TASK表,该表用于保存系统监测任务,以下是相关字段及索引:
ID:主键;
MON_TIME:监测时间;
STATUS_ID:任务状态;
索引:KEY_TSKTASK_MONTIME2 (STATUS_ID, MON_TIME)。
分析,涉及的两条语句应该不会涉及相同的TSK_TASK记录,那为什么会造成死锁呢?
查询MySQL官网文档,发现这跟MySQL的索引机制有关。MySQL的InnoDB引擎是行级锁,我原来的理解是直接对记录进行锁定,实际上并不是这样的。
要点如下:
不是对记录进行锁定,而是对索引进行锁定;
在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking;
如语句UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID > 10000会锁定所有主键大于等于1000的所有记录,在该语句完成之前,你就不能对主键等于10000的记录进行操作;
当非簇索引(non-cluster index)记录被锁定时,相关的簇索引(cluster index)记录也需要被锁定才能完成相应的操作。
再分析一下发生问题的两条SQL语句,就不难找到问题所在了:
当“update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME
假设“update TSK_TASK set STATUS_ID=1067,UPDATE_TIME=now () where ID in (9921180)”几乎同时执行时,本语句首先锁定簇索引(主键),由于需要更新STATUS_ID的值,所以还需要锁定KEY_TSKTASK_MONTIME2的某些索引记录。
这样第一条语句锁定了KEY_TSKTASK_MONTIME2的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待KEY_TSKTASK_MONTIME2的记录,在此情况下,死锁就产生了。
笔者通过拆分第一条语句解决死锁问题:
先查出符合条件的ID:select ID from TSK_TASK where STATUS_ID=1061 and MON_TIME
至此,死锁问题彻底解决

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

Le programme en cours d'exécution est appelé un processus. Un processus peut être une application exécutée sur le système d'exploitation actuel ou une application liée au système d'exploitation. Si une application est liée au système d'exploitation, elle crée d'abord un processus pour s'exécuter. D'autres applications s'appuient sur les services du système d'exploitation pour leur exécution. La plupart des applications sont des services du système d'exploitation et des applications d'arrière-plan qui gèrent le système d'exploitation, les logiciels et le matériel. En python, nous avons différentes méthodes pour vérifier si l'application est ouverte ou non. Apprenons-les en détail un par un. Utilisation de la fonction psutil.process_iter() psutil est un module en Python qui fournit aux utilisateurs une interface pour récupérer des informations sur les processus en cours d'exécution et l'utilisation du système.

Un objet itérable est un objet dont tous les éléments peuvent être itérés à l'aide d'une boucle ou d'une fonction itérable. Les listes, chaînes, dictionnaires, tuples, etc. sont tous appelés objets itérables. En langage Python, il existe différentes manières de vérifier si un objet est itérable. Jetons un coup d'œil un par un. Utilisation des boucles En Python, nous avons deux techniques de bouclage, l'une utilise la boucle "for" et l'autre utilise la boucle "while". En utilisant l'une ou l'autre de ces deux boucles, nous pouvons vérifier si un objet donné est itérable. Exemple Dans cet exemple, nous allons essayer d'itérer un objet en utilisant la boucle "for" et vérifier s'il est itéré ou non. Ci-dessous le code. l=["pomme",22,"orange
![La vérification orthographique ne fonctionne pas dans Teams [Corrigé]](https://img.php.cn/upload/article/000/887/227/170968741326618.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Nous avons commencé à remarquer que parfois la vérification orthographique cesse de fonctionner pour Teams. La vérification orthographique est un outil essentiel pour une communication efficace, et toute attaque contre celui-ci peut perturber considérablement le flux de travail. Dans cet article, nous explorerons les raisons courantes pour lesquelles la vérification orthographique peut ne pas fonctionner comme prévu et comment la restaurer à son état précédent. Ainsi, si la vérification orthographique ne fonctionne pas dans Teams, suivez les solutions mentionnées dans cet article. Pourquoi la vérification orthographique de Microsoft ne fonctionne-t-elle pas ? Il peut y avoir plusieurs raisons pour lesquelles la vérification orthographique de Microsoft ne fonctionne pas correctement. Ces raisons incluent des paramètres de langue incompatibles, une fonction de vérification orthographique désactivée, une installation MSTeam ou MSOffice endommagée, etc. En outre, MSTeams et MSOF obsolètes

Comment vérifier l’état de santé du SSD sous Windows 11 ? Pour leurs vitesses de lecture, d'écriture et d'accès rapides, les SSD remplacent rapidement les disques durs, mais même s'ils sont plus fiables, vous devez toujours vérifier la santé de vos SSD sous Windows 11. Comment le faire fonctionner ? Dans ce tutoriel, l'éditeur partagera avec vous la méthode. Méthode 1 : utilisez WMIC1, utilisez la combinaison de touches Win+R, tapez wmic, puis appuyez ou cliquez sur OK. Entrez 2. Maintenant, tapez ou collez la commande suivante pour vérifier l'état de santé du SSD : diskdrivegetstatus Si vous recevez le message « Statut : OK », votre disque SSD fonctionne normalement.

Le téléphone mobile Apple est le téléphone mobile le plus largement choisi par les gens récemment, mais nous voyons souvent des gens discuter en ligne de la différence entre les téléphones mobiles Apple verrouillés et déverrouillés, et ils se demandent lequel acheter. Aujourd'hui, Chen Siqi partagera avec vous la différence entre les iPhones verrouillés et déverrouillés et vous aidera à résoudre les problèmes. En fait, il n’y a pas beaucoup de différence entre les deux en termes d’apparence et de fonction. La clé réside dans le prix et l’utilisation. Qu'est-ce qu'une version verrouillée et une version déverrouillée ? Un iPhone sans restrictions de verrouillage signifie qu'il n'est pas limité par l'opérateur et que la carte SIM de n'importe quel opérateur peut être utilisée normalement. Une version verrouillée signifie qu'elle dispose d'un verrouillage réseau et ne peut utiliser que la carte SIM fournie par l'opérateur désigné et ne peut pas en utiliser d'autres. En fait, les téléphones Apple déverrouillés peuvent utiliser le mobile,

Comment vérifier si une chaîne commence par un caractère spécifique en Golang ? Lors de la programmation en Golang, vous rencontrez souvent des situations où vous devez vérifier si une chaîne commence par un caractère spécifique. Pour répondre à cette exigence, nous pouvons utiliser les fonctions fournies par le package strings dans Golang pour y parvenir. Ensuite, nous présenterons en détail comment utiliser Golang pour vérifier si une chaîne commence par un caractère spécifique, avec des exemples de code spécifiques. En Golang, nous pouvons utiliser HasPrefix du package strings

Vous pouvez utiliser la méthode contain() de l'interface List pour vérifier si un objet existe dans la liste. Méthode contain() booleancontains(Objecto) Renvoie true si cette liste contient l'élément spécifié. Plus formellement, renvoie vrai si et seulement si cette liste contient au moins un élément e tel que (o==null?e==null:o.equals(e)). Paramètre c - l'élément dont la présence dans cette liste doit être testée. Valeur de retour Renvoie vrai si cette liste contient l'élément spécifié. Lève ClassCastException - si le type de l'élément spécifié est incompatible avec cette liste (facultatif). NulP

Titre : Comment utiliser Oracle pour demander si une table est verrouillée ? Dans la base de données Oracle, le verrouillage de table signifie que lorsqu'une transaction effectue une opération d'écriture sur la table, les autres transactions seront bloquées lorsqu'elles souhaitent effectuer des opérations d'écriture sur la table ou apporter des modifications structurelles à la table (telles que l'ajout de colonnes, la suppression de lignes). , etc.). Dans le processus de développement actuel, nous devons souvent nous demander si la table est verrouillée afin de mieux dépanner et traiter les problèmes associés. Cet article explique comment utiliser les instructions Oracle pour demander si une table est verrouillée et donne des exemples de code spécifiques. Pour vérifier si la table est verrouillée, nous
