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

MySQL :mises à jour simultanées (via des threads) sur une table simple

Le verrouillage est implicite, oui, mais il n'est pas fait par executeUpdate() . Le moteur de stockage de MySQL gère le verrouillage et le déverrouillage.

Chaque fois que vous écrivez dans une table MyISAM, votre requête attend que le verrou en écriture sur la table soit disponible, le verrou en écriture est acquis, l'écriture est effectuée et le verrou en écriture est libéré. Il n'y a pas de véritable concurrence en écriture dans MyISAM car chaque travailleur attend en fait le verrou en écriture. Vous n'obtenez pas d'erreur car les demandes d'écriture sont sérialisées.

La situation avec InnoDB est similaire mais très différente, en ce sens qu'InnoDB ne verrouille qu'une partie de la table, généralement au niveau de la ligne, où InnoDB peut verrouiller une plage dans un index, verrouillant ainsi les lignes à cette plage dans l'index (et le vide qui les précède). Ce verrouillage est plus granulaire que le verrouillage de table, permettant un meilleur comportement de concurrence, mais il n'y a pas d'opération simultanée sur la même ligne -- chaque travailleur attend le ou les verrous dont il a besoin.

Dans les deux cas, les verrous sont implicitement pris.