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

UPDATE avec SELECT, verrouillera-t-il chaque ligne ou tous les enregistrements sélectionnés

La UPDATE s'exécute en transaction - c'est un atomic opération, ce qui signifie que si l'une des lignes échoue (à cause d'une contrainte unique par exemple), elle ne mettra à jour aucune des 5000 lignes. C'est l'une des propriétés ACID d'une base de données transactionnelle.

Pour cette raison, la UPDATE détenir un verrou sur toutes les lignes pour l'ensemble de la transaction. Sinon, une autre transaction peut mettre à jour davantage la valeur d'une ligne, en fonction de sa valeur actuelle (par exemple, mettre à jour les enregistrements définis valeur =valeur * '2'). Cette instruction doit produire un résultat différent selon que la première transaction est validée ou annulée. Pour cette raison, il doit attendre la première transaction pour terminer les 5000 mises à jour.

Si vous souhaitez libérer les verrous, effectuez simplement la mise à jour par lots (plus petits).

PS autocommit contrôle si chaque instruction est émise dans sa propre transaction, mais n'affecte pas l'exécution d'une seule requête