Question

Je suis en train de lire un manuel sur les transactions InnoDB, mais encore, il y a beaucoup de choses pas claires pour moi. Par exemple, je ne comprends pas tout à fait le comportement suivant:

-- client 1                             -- client 2
mysql> create table simple (col int) 
       engine=innodb; 

mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select @@tx_isolation;                                                              
+-----------------+                                                                         
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |                                                                         
+-----------------+

mysql> begin;                                    
Query OK, 0 rows affected (0.01 sec)            
                                        mysql> begin;
                                        Query OK, 0 rows affected (0.00 sec)

mysql> update simple set col=10 where col=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

                                         mysql> update simple set col=42 where col=2;
                                         -- blocks

Maintenant, la dernière commande de mise à jour (dans le client 2) attend. Je me attends à la commande à exécuter parce que je suppose que la ligne 1 est verrouillée. Le comportement est le même, même si la deuxième commande du client 2 est insert. Quelqu'un pourrait-il décrire l'arrière-plan de verrouillage derrière cet exemple (où et pourquoi les serrures)?

Était-ce utile?

La solution

InnoDB pose certains types de serrures comme suit.

  • SELECT ... FROM est une lecture cohérente, la lecture d'un instantané de la base de données et la mise sans verrous à moins que le niveau d'isolation de transaction est réglée sur SERIALIZABLE. Pour le niveau SERIALIZABLE, les ensembles de recherche partagés verrous sur la prochaine clé sur les enregistrements d'index qu'il rencontre.

  • SELECT ... FROM ... LOCK IN SHARE MODE ensembles partagés verrous nouvelle clé sur tous les index que les rencontres de recherche.

  • Pour les enregistrements d'index les rencontres de recherche, SELECT ... FROM ... pour les blocs UPDATE autres sessions de faire SELECT ... FROM ... LOCK IN SHARE MODE ou à la lecture de certains niveaux d'isolation des transactions. Conformément lit ignorera tous les verrous mis sur les dossiers qui existent dans la vue en lecture.

  • UPDATE ... WHERE ... définit un verrou de clé exclusive sur chaque ligne que la recherche.

  • DELETE FROM ... WHERE ... définit un verrou de clé exclusive sur chaque ligne que la recherche.

  • INSERT définit un verrou exclusif sur la ligne insérée. Ce verrou est un verrou fiche-index, pas un verrou de clé suivante (qui est, il n'y a pas de verrou d'intervalle) et ne l'empêche pas d'autres sessions d'insérer dans la fente avant de la ligne insérée.

InnoDB dispose de plusieurs types de serrures niveau record:

  • verrouillage enregistrement. Ceci est un verrou sur un enregistrement d'index

  • verrouillage Gap. Ceci est un verrou sur un écart entre les lignes d'index, ou un verrou sur l'écart avant la première ou après le dernier enregistrement d'index

  • verrou de clé. Ceci est une combinaison d'un verrou d'enregistrement sur l'enregistrement d'index et un verrou de trou sur l'écart avant que l'enregistrement d'index

Voir plus:

éviter le problème Phantom Utiliser verrouillage clé suivante

éviter l'impasse

Autres conseils

ypercube a raison. Plus précisément, sans un index unique qui est utilisé dans l'état, il se verrouille plus de la ligne unique étant affectée.

Pour voir le comportement que vous attendez, changer votre création de la table à ceci:

create table simple (col int unique) ENGINE=InnoDB;

L'index unique sur le champ col lui permettra de verrouiller uniquement la ligne affectée.

"Pour l'index enregistre les rencontres de recherche, SELECT ... FROM ... pour les blocs UPDATE autres sessions de faire SELECT ... FROM ... LOCK IN SHARE MODE ou de la lecture dans certains niveaux d'isolation des transactions. Conformément lit volonté ignorer tous les verrous mis sur les dossiers qui existent dans la vue en lecture "

Quels sont ces certains verrous qui peuvent être appliquées avec sélection pour la mise à jour afin que les autres sessions ne peuvent pas lire l'enregistrement verrouillé?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top