Lorsqu'un enregistrement est verrouillé, pouvons-nous savoir lequel est verrouillé?
Comment puis-je obtenir le Rowid d'enregistrement ou quelque chose d'autre?
Je peux obtenir des informations par ce sql
SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
J'ai trouvé une méthode sur le Web pour obtenir Rowid en utilisant la fonction DBMS_ROWID.ROWID_CREATE()
Mais cela ne semble pas fonctionner.
V$LOCK
.Réponses:
Vous ne pouvez pas vraiment répertorier toutes les lignes qui sont verrouillées par une session. Cependant, une fois qu'une session est bloquée par une autre, vous pouvez trouver quelle session / ligne la bloque.
Oracle ne gère pas de liste de verrous de ligne individuels. Au contraire, les verrous sont enregistrés directement à l'intérieur des lignes elles-mêmes - pensez-y comme une colonne supplémentaire.
Vous pouvez trouver quelle session a acquis un verrou sur un objet via la
V$LOCK
vue, mais cela ne listera que les informations générales, pas au niveau de la ligne.Avec cette vue, vous pouvez également trouver si une session est bloquée par une autre. Dans ce cas, si une session est bloquée par une autre session, les informations de ligne s'affichent dans les
V$SESSION
informations.Vous pouvez récupérer le rowid, construisons un exemple avec 2 sessions:
La session 2 attend maintenant la session 1. Nous pouvons découvrir la ligne de blocage avec:
Pour en savoir plus: une description du processus par Tom Kyte .
la source
Vous pouvez trouver tous les verrous de tables dans une base de données Oracle en exécutant la requête suivante
la source