Mysql
 sql >> Base de données >  >> RDS >> Mysql

cela verrouille-t-il la base de données ?

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 :

  1. Créez deux tables avec la même structure :table_a et table_b .
  2. Remplir table_a avec 500 000 lignes.
  3. Copier les données de table_a à table_b en utilisant un INSERT INTO ... SELECT déclaration.
  4. Pendant le processus de copie, utilisez une autre session pour insérer une nouvelle ligne dans table_a .
  5. 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.