J'ai rencontré un problème de verrouillage InnoDB pour les transactions sur une table avec une clé primaire et un indice unique séparé. Il semble si un TX supprime une enregistrement à l'aide d'une clé unique, puis réinsère ce même enregistrement, cela se traduira par un verrou de clé suivant au lieu de la serrure d'enregistrement prévue (puisque la clé est unique). Voir ci-dessous pour un étui à tester ainsi que la ventilation des enregistrements que je m'attends à avoir ce que serrures: (Remarque: il suffit d'exécuter le TX2 SQL après la connexion TX1 SQL, dans une connexion distincte) TX1 H2>
START TRANSACTION;
INSERT INTO foo VALUES(7,7);
3 Réponses :
Le problème que vous rencontrez se produit car MySQL ne verrouille pas simplement la ligne de table pour une valeur que vous allez insérer, il verrouille toutes les valeurs possibles entre le précédent ID code> et l'identifiant suivant ordre, donc, réutilisez votre exemple ci-dessous:
START TRANSACTION;
REPLACE INTO foo VALUES(11,11);
Non, MySQL n'émet pas de verrouillages de l'écart pour les insertions d'index groupées (il émet un verrou d'intention d'intention d'insertion qui ne bloque pas d'insertions simultanées dans l'écart). Cela semble être lié à la suppression de la suppression et de l'insertion ultérieure à un indice groupé et non clusterné (marquage de suppression avec une suppression ultérieure) qui a abouti à une double écluse (qui est ce que vous avez remarqué), mais cela semble inutile tome.
Il semble que le problème puisse mentir dans le fait que les indices InnoDB sont bizarres. P>
La clé principale (clustered) est La clé unique sur faire un Cela nécessiterait du verrouillage interne bizarre au sein du mécanisme MVCC. P>
Vous devrez peut-être modifier le niveau d'isolation de votre transaction pour permettre des lectures sales (c'est-à-dire de ne pas avoir de lecture répétable) p>
jouer des jeux avec Cliquez ici pour voir la syntaxe pour la définition du niveau d'isolation dans un Session Sinon, il suffit de définir la permanente dans /etc/my.cnf (exemple) p>
[mysqld] Essayez !!! P> i code> et il y aurait un
Rowid code> associé à celui-ci. p>
j code> (non clustered) a le
rowid code> de
i code> associé à la valeur de
j code> dans l'index. p>
Supprimer code> suivi d'un insert code> sur la même valeur de clé pour
i code> devrait produire un autre
Rowid code > Pour la clé primaire (clustered) et, également, un autre
Rowid code> à associer à la valeur de
j code> (non clustered). P>
tx_isolation code> variable dans une session
Essayez read_committed code> et
read_uncommited code> p>
Cliquez ici pour voir comment il y avait une fois un bogue concernant cela dans une session et l'avertissement sur la manière dont Pour l'utiliser soigneusement p>
transaction_isolation = lecture-engagée code> p>
https://bugs.mysql.com/bug.php?id=68021 p>
Ce problème de bogue répond à votre question. P>
Il s'agit de la faille de conception de Innodb, l'amont utilisé pour fixer ce problème pour éviter le verrouillage de l'écart dans Row_ins_Scan_sec_index_for_duplicate dans l'isolation en lecture. Cependant, il ressort un autre problème, la cause du correctif cause une violation clé unique de l'indice secondaire silencieusement, de sorte que l'amont revenait ce correctif. P>