MySQL中InnoDB的间隙锁问题_MySQL
在为一个客户排除死锁问题时我遇到了一个有趣的包括InnoDB间隙锁的情形。对于一个WHERE子句不匹配任何行的非插入的写操作中,我预期事务应该不会有锁,但我错了。让我们看一下这张表及示例UPDATE。
mysql> SHOW CREATE TABLE preferences \G *************************** 1. row *************************** Table: preferences Create Table: CREATE TABLE `preferences` ( `numericId` int(10) unsigned NOT NULL, `receiveNotifications` tinyint(1) DEFAULT NULL, PRIMARY KEY (`numericId`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT COUNT(*) FROM preferences; +----------+ | COUNT(*) | +----------+ | 0 | +----------+ 1 row in set (0.01 sec) mysql> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2'; Query OK, 0 rows affected (0.01 sec) Rows matched: 0 Changed: 0 Warnings: 0
InnoDB状态显示这个UPDATE在主索引记录上持有了一个X锁:
---TRANSACTION 4A18101, ACTIVE 12 sec 2 lock struct(s), heap size 376, 1 row lock(s) MySQL thread id 3, OS thread handle 0x7ff2200cd700, query id 35 localhost msandbox Trx read view will not see trx with id >= 4A18102, sees < 4A18102 TABLE LOCK table `test`.`preferences` trx id 4A18101 lock mode IX RECORD LOCKS space id 31766 page no 3 n bits 72 index `PRIMARY` of table `test`.`preferences` trx id 4A18101 lock_mode X
这是为什么呢,Heikki在其bug报告中做了解释,这很有意义,我知道修复起来很困难,但略带厌恶地我又希望它能被差异化处理。为完成这篇文章,让我证明下上面说到的死锁情况,下面中mysql1是第一个会话,mysql2是另一个,查询的顺序如下:
mysql1> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql1> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '1'; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql2> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql2> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2'; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql1> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('1', '1'); -- This one goes into LOCK WAIT mysql2> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('2', '1'); ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
现在你看到导致死锁是多么的容易,因此一定要避免这种情况——如果来自于事务的INSERT部分导致非插入的写操作可能不匹配任何行的话,不要这样做,使用REPLACE INTO或使用READ-COMMITTED事务隔离。

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)

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,

InnoDB est l'un des moteurs de base de données de MySQL. C'est désormais le moteur de stockage par défaut de MySQL et l'une des normes pour les versions binaires de MySQL AB adopte un système d'autorisation à double voie, l'une est une autorisation GPL et l'autre est un logiciel propriétaire. autorisation. InnoDB est le moteur préféré pour les bases de données transactionnelles et prend en charge les tables de sécurité des transactions (ACID) ; InnoDB prend en charge les verrous au niveau des lignes, qui peuvent prendre en charge dans la plus grande mesure la concurrence. Les verrous au niveau des lignes sont implémentés par la couche moteur de stockage.

InnoDB est un moteur de stockage qui stocke les données dans des tables sur disque, de sorte que nos données existeront toujours même après l'arrêt et le redémarrage. Le processus réel de traitement des données se produit en mémoire, de sorte que les données du disque doivent être chargées dans la mémoire. S'il traite une demande d'écriture ou de modification, le contenu de la mémoire doit également être actualisé sur le disque. Et nous savons que la vitesse de lecture et d'écriture sur le disque est très lente, ce qui est plusieurs ordres de grandeur différents de la lecture et de l'écriture en mémoire. Ainsi, lorsque nous voulons obtenir certains enregistrements de la table, le moteur de stockage InnoDB doit-il lire. les enregistrements du disque un par un ? La méthode adoptée par InnoDB consiste à diviser les données en plusieurs pages et à utiliser les pages comme unité de base d'interaction entre le disque et la mémoire. La taille d'une page dans InnoDB est généralement de 16.

pythonGIL (Global Interpreter Lock) est un mécanisme important en Python. Il limite le fait qu'un seul thread puisse exécuter le bytecode Python en même temps. Il s'agit principalement de garantir la stabilité de l'interpréteur Python, car les mécanismes de gestion de la mémoire et de garbage collection de Python sont monothread. Si plusieurs threads sont autorisés à exécuter le bytecode Python en même temps, une corruption de la mémoire ou d'autres erreurs imprévisibles peuvent en résulter. Le principe du GIL est relativement simple. Il s'agit d'un verrou maintenu par l'interpréteur Python, et lorsqu'un thread exécute le bytecode Python, il acquiert le GIL. Si d'autres threads souhaitent exécuter le bytecode Python, ils doivent attendre que le GIL soit publié. Lorsque le GIL est libéré, d'autres

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

À mesure que les applications Internet deviennent de plus en plus grandes, les systèmes distribués deviennent de plus en plus courants. Dans ces systèmes, les verrous distribués sont une fonctionnalité essentielle. En raison de la forte demande de verrous distribués, il existe différentes méthodes de mise en œuvre. Parmi eux, Redis est un outil populaire largement utilisé dans la mise en œuvre de verrous distribués. Dans cet article, nous explorerons la comparaison des performances des verrous distribués implémentés par Redis. 1. Concepts de base de Redis Avant de discuter des performances de verrouillage distribué de Redis, nous devons comprendre certains concepts de base de Redis.

Les verrous dans le langage Go implémentent un code concurrent synchronisé pour empêcher la concurrence des données : Mutex : verrouillage Mutex, qui garantit qu'un seul goroutine acquiert le verrou en même temps et est utilisé pour le contrôle des sections critiques. RWMutex : verrouillage en lecture-écriture, qui permet à plusieurs goroutines de lire des données en même temps, mais une seule goroutine peut écrire des données en même temps. Il convient aux scénarios nécessitant une lecture et une écriture fréquentes de données partagées.

1. Restaurez et réinstallez MySQL Afin d'éviter d'avoir à importer ces données depuis d'autres endroits, effectuez d'abord une sauvegarde du fichier de base de données de la bibliothèque actuelle (/var/lib/mysql/location). Ensuite, j'ai désinstallé le package Perconaserver5.7, réinstallé l'ancien package 5.1.71 d'origine, démarré le service mysql, et il a demandé Unknown/unsupportedtabletype:innodb et n'a pas pu démarrer normalement. 11050912:04:27InnoDB : initialisation du pool de tampons, taille = 384,0 M11050912:04:27InnoDB : terminé
