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

Comment trouver des lignes verrouillées dans Oracle

Oracle Le concept de verrouillage de est assez différent de celui des autres systèmes.

Lorsqu'une ligne dans Oracle est verrouillé, l'enregistrement lui-même est mis à jour avec la nouvelle valeur (le cas échéant) et, en outre, un verrou (qui est essentiellement un pointeur vers le verrou de transaction qui réside dans le segment d'annulation) est placé directement dans l'enregistrement.

Cela signifie que le verrouillage d'un enregistrement dans Oracle signifie mettre à jour les métadonnées de l'enregistrement et émettre une écriture de page logique. Par exemple, vous ne pouvez pas faire SELECT FOR UPDATE sur un tablespace en lecture seule.

De plus, les enregistrements eux-mêmes ne sont pas mis à jour après la validation :à la place, le segment d'annulation est mis à jour.

Cela signifie que chaque enregistrement contient des informations sur la transaction qui l'a mis à jour en dernier, même si la transaction elle-même est morte depuis longtemps. Pour savoir si la transaction est active ou non (et, par conséquent, si l'enregistrement est actif ou non), il est nécessaire de visiter le segment d'annulation.

Oracle n'a pas de gestionnaire de verrous traditionnel, ce qui signifie que l'obtention d'une liste de tous les verrous nécessite l'analyse de tous les enregistrements dans tous les objets. Cela prendrait trop de temps.

Vous pouvez obtenir des verrous spéciaux, comme des objets de métadonnées verrouillés (en utilisant v$locked_object ), le verrouillage attend (en utilisant v$session ) etc, mais pas la liste de tous les verrous sur tous les objets de la base de données.