Lorsque j'essaie d'insérer/mettre à jour quelque chose dans une table de base de données, Oracle verrouille-t-il la totalité de la table ou uniquement la ligne insérée/mise à jour?
Est-ce quelque chose qui peut être contrôlé via une configuration externe?
Nous pouvons émettre des verrous explicitement avec la commande LOCK TABLE. En savoir plus
Sinon, une insertion ne verrouille aucune autre ligne. En raison du modèle d'isolation en lecture d'Oracle, cette ligne n'existe que dans notre session jusqu'à ce que nous la validions. Personne d'autre ne peut rien en faire. En savoir plus .
Une instruction de mise à jour verrouille uniquement les lignes affectées. Sauf si nous avons implémenté une stratégie de verrouillage pessimiste avec SELECT ... FOR UPDATE. En savoir plus .
Enfin, dans Oracle, les auteurs ne bloquent pas les lecteurs. Ainsi, même les lignes verrouillées peuvent être lues par d'autres sessions, elles ne peuvent tout simplement pas être modifiées. En savoir plus .
Ce comportement est intégré au noyau Oracle et n'est pas configurable.
Justin souligne le verrouillage DDL au niveau de la table. Ce verrou fera en sorte qu'une session exécutant une DDL sur la table attendra que la session DML soit validée, à moins que la DDL ressemble à CREATE INDEX, auquel cas elle échouera immédiatement avec ORA-00054.
Lorsqu'un fichier DML standard est exécuté (UPDATE/DELETE/INSERT, MERGE et SELECT ... FOR UPDATE), Oracle obtient 2 verrous . Verrou au niveau de la ligne (TX) - Ceci permet d'obtenir un verrou sur la ligne concernée et toute l’autre transaction tentant de modifier la même ligne est bloquée jusqu’à ce que celle qui la possède déjà se termine . Verrouillage du niveau de table (TM) - Lorsque le verrouillage de la ligne (TX) est obtenu, un verrou de table supplémentaire est également obtenu pour empêcher se produire pendant qu'une DML est en cours.
L’important est cependant de savoir dans quel mode le verrou de table est obtenu . Un verrou de partage de ligne (RS), également appelé verrou de sous-partage de table (SS), indique que la transaction qui détient le verrou sur la table a des lignes verrouillées dans la table. et a l'intention de les mettre à jour. Un verrou SS est le mode de verrouillage de table le moins restrictif, offrant le plus haut degré de simultanéité pour une table.
Un verrou de ligne exclusif (RX), également appelé verrou de table sous-exclusif (SX), indique que la transaction qui détient le verrou a mis à jour des lignes de table ou a émis SELECT ... FOR UPDATE. Un verrou SX permet à d’autres transactions d’interroger, d’insérer, de mettre à jour, de supprimer ou de verrouiller des lignes simultanément dans la même table. Par conséquent, les verrous SX permettent à plusieurs transactions d'obtenir simultanément des verrous SX et SS pour la même table.
Un verrou de table de partage (S) détenu par une transaction permet à d'autres transactions d'interroger la table (sans utiliser SELECT ... FOR UPDATE) mais n'autorise les mises à jour que si une seule transaction détient le verrou de table de partage. Plusieurs transactions peuvent contenir simultanément un verrou de table de partage. Par conséquent, le maintien de ce verrou n'est pas suffisant pour garantir qu'une transaction peut modifier la table.
Un verrou de table exclusif de ligne de partage (SRX), également appelé verrou de table de sous-partage partagé (SSX), est plus restrictif qu'un verrou de table de partage. Une seule transaction à la fois peut acquérir un verrou SSX sur une table donnée. Un verrou SSX détenu par une transaction permet à d'autres transactions d'interroger la table (à l'exception de SELECT ... FOR UPDATE), mais pas de mettre à jour la table.
Un verrou de table exclusif (X) est le mode de verrouillage de table le plus restrictif, permettant à la transaction qui détient le verrou d'accéder en écriture à la table. Une seule transaction peut obtenir un verrou X pour une table.
Cela dépend de ce que vous entendez par "verrouiller".
Pour 99,9% des préoccupations des utilisateurs, Oracle acquiert un verrou au niveau de la ligne lorsqu'une ligne est modifiée. Le verrou au niveau de la ligne permet toujours aux lecteurs de lire la ligne (en raison de la cohérence de lecture multi-version, les auteurs ne bloquent jamais les lecteurs et les lecteurs ne font jamais de lectures non conformes).
Si vous fouillez v$lock
, vous verrez que la mise à jour d'une ligne supprime également un verrou sur la table. Mais ce verrou empêche uniquement une autre session de faire DDL sur la table. Comme vous ne voudriez pratiquement jamais faire de DDL sur une table active, ce n’est généralement pas ce qui pourrait faire attendre une autre session pour le verrou.
Vous devriez probablement lire le manuel des concepts Oracle concernant le verrouillage . Pour les opérations DML standard (insertion, mise à jour, suppression, fusion), Oracle utilise un verrou DML partagé (type TM) . Cela permet aux autres DML de la table de se produire simultanément (il s’agit d’un verrou de partage.) Les lignes modifiées par une opération de mise à jour ou de suppression DML et qui ne sont pas encore validées auront un verrou de ligne exclusif (type TX). Une autre opération DML dans une autre session/transaction peut opérer sur la table, mais si elle modifie la même ligne, elle sera bloquée jusqu'à ce que le détenteur du verrou de ligne la libère en la validant ou en la rétrogradant.
Les opérations DML parallèles et les opérations de chargement direct par insertion de série utilisent des verrous de table exclusifs.