MySQL 'select for update' comportement
Conformément à la documentation de MySql, MySql prend en charge Plusieurs granularité de verrouillage(MGL).
cas-1
Ouvert terminal-1:
//connecté à mysql
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select id, status from tracking_number limit 5 for update;
+----+--------+
| id | status |
+----+--------+
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 4 | 0 |
| 5 | 0 |
+----+--------+
5 rows in set (0.00 sec)
mysql>
gauche, il a ouvert et a ouvert le terminal-2:
//connecté à mysql
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select id, status from tracking_number limit 5 for update;
<!-- Hangs here. and after some time it says-->
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Si il ya beaucoup de lignes à récupérer, T2 attend jusqu'à ce t1 se termine.
cas-2
Gauche terminal-1 comme il est.Maintenant dans le terminal-2:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
<!-- case 2.1 -->
mysql> select id, status from tracking_number where id=1;
+----+--------+
| id | status |
+----+--------+
| 1 | 0 |
+----+--------+
1 row in set (0.00 sec)
mysql> select id, status from tracking_number where id=2;
+----+--------+
| id | status |
+----+--------+
| 2 | 0 |
+----+--------+
1 row in set (0.00 sec)
<!-- case 2.2 -->
mysql> select * from tracking_number where id=2 for update;
<!-- Hangs here. and after some time -->
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
-
Mais pourquoi dans le cas 1, T2 attend pour le même ensemble de lignes T1 a verrouillé?
-
Signifie-t-il de la surabondance de la requête select (même avec limint paramètre. J'ai essayé avec une autre gamme aussi) bloque l'ensemble de la table?
- Est-il possible de laisser les transactions à verrouiller de façon indépendante, sans préciser le champ de l'enregistrement(c'est à dire, sans l'aide de où le champ=valeur)?
- Généralement (ou par Java simultanées de verrouillage), verrou d'écriture est exclusive et lire n'est pas. En cas 2.1, si les enregistrements sont en écrire le mode de verrouillage, comment T2 pouvez lire les mêmes enregistrements? Depuis ce qui est permis de ce qui est le point de verrouillage?
- 2.2 est entendu.
Ouvert un terminal et d'une transaction:
mysql> update tracking_number set status=4 where status=0 limit 5;
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5 Changed: 5 Warnings: 0
Laissé là et a ouvert un autre terminal et de transaction:
mysql> update tracking_number set status=5 where status=0 limit 5;
T2 n'a pas réussi jusqu'à ce que j'ai commis (ou de restauration) T1.
- Pourquoi ce comportement?
Vous devez vous connecter pour publier un commentaire.
Me laisser aller par le biais de votre cas et expliquer comment ces écluses:
1 cas
T1 souhaite mettre à jour certaines lignes de votre table de test. Cette transaction met IX de verrouillage sur toutes les tables et verrou X sur les 5 premières lignes.
T2 souhaite mettre à jour certaines lignes de votre table de test. Cette transaction met IX (car IX compatible avec IX) de verrouillage sur l'ensemble de la table et tente de les 5 premières lignes mais il ne peut pas le faire parce que X n'est pas compatible avec X
Donc, nous sommes bien.
2.1 cas
T1 souhaite mettre à jour certaines lignes de votre table de test. Cette opération mettre IX de verrouillage sur toutes les tables et verrou X sur les 5 premières lignes.
T2 veut sélectionner certaines lignes de votre table de test. Et il ne place pas tous les verrous (parce que InnoDB fournit de la non-fermeture lit)
2.1 cas
T1 souhaite mettre à jour certaines lignes de votre table de test. Cette opération mettre IX de verrouillage sur toutes les tables et verrou X sur les 5 premières lignes.
T2 souhaite mettre à jour (select for update)des lignes de votre table de test. Lieu sur l'ensemble de la table et tente de s'verrou S sur la ligne et ne parvient pas parce que X et S sont incompatibles.
Également toujours être conscient du niveau d'isolation: différents niveaux à l'origine des différents mécanisme gratuit/acquisition de verrous
Espère que cela aide
LOCK TABLE
ou de configurer le niveau d'isolation que "SERIALIZABLE" (mais je suppose que votre réponse doit être "oui").