Pour moi, la documentation n'est pas claire :
Méthodes de verrouillage interne suggère que, dans certaines circonstances, il est possible d'insérer dans une table MyISAM pendant qu'une autre session est en train de la lire :
Cependant, Problèmes de verrouillage de table montre une situation où la table sera verrouillée jusqu'à ce que le SELECT soit terminé (cela correspond à votre situation) :
La table InnoDB implémente des verrous au niveau de la ligne, de sorte que seule la ligne en cours de lecture sera verrouillée, plutôt que la table entière.
Plutôt que de me fier uniquement à la documentation, j'ai tenté un petit test :
- Créez deux tables avec la même structure :
table_a
ettable_b
. - Remplir
table_a
avec 500 000 lignes. - Copier les données de
table_a
àtable_b
en utilisant unINSERT INTO ... SELECT
déclaration. - Pendant le processus de copie, utilisez une autre session pour insérer une nouvelle ligne dans
table_a
. - Vérifier si
table_b
contient le nouvel enregistrement.
Lorsque les deux tables où MyISAM, table_b
ne contenait pas le nouvel enregistrement après la copie. Lorsque les deux tables étaient InnoDB, table_b
contenait le nouvel enregistrement après la copie. J'ai répété cela trois fois et, comme prévu, le résultat était le même à chaque fois.
Donc, en bref, si votre table est MyISAM, elle sera verrouillée. Si c'est InnoDB, ce ne sera pas le cas. Bien sûr, ce test ne tient pas compte des mises à jour, mais je m'attends à ce que les résultats soient similaires.