2017-02-27 2 views
1

Ich bin in einer Situation fest, wo ich eine Select-Anweisung mit FOR UPDATE SKIP LOCKED verwenden. Below Abfrage ist Teil eines Verfahrens, das von mehreren parallelen Jjobs in RAC-Umgebung aufgerufen wird ausgeführt:FÜR UPDATE SKIP LOCKED Verriegelungstabelle nicht in Select-Anweisung Oracle

CURSOR MyCursor IS 
SELECT A.ID, A.NEXTSEQNBR, A.EVENTTYPCD, A.EVMEVENTID , B.EVENTTTIMESTAMP 
FROM Table1 A 
INNER JOIN Table2 B ON A.ID = B.ID 
     AND A.NEXTSEQNBR - 1 = B.SEQNBR 
WHERE B.STATCD = 'MYVAL' 
AND MOD(A.ID, 1) = 0 
FOR UPDATE SKIP LOCKED; 

Tabelle 1 hat eine Master-Tabelle mit dem Namen EVENTTYPTABLE1. Table1.EVENTTYPCD-Spalte ist ein Fremdschlüssel, der auf EVENTTYPTABLE1 verweist.

In der Produktionsumgebung habe ich die gesperrten Objekte überprüft und festgestellt, dass die Haupttabelle EVENTTYPTABLE1 gesperrt ist, obwohl ich in der obigen Abfrage die Haupttabelle EVENTTYPTABLE1 nicht verwende. Ich erwartete Table1 und Table2 Tabelle in einer Lock-Situation wegen der FOR UPDATE SKIP LOCKED. Aber warum EVENTTYPTABLE1? Ich vermisse etwas?

Natürlich wird der Cursor in der Prozedur geöffnet und abgerufen.

+0

Ich bin nicht vor einer Oracle-Instanz jetzt Antwort vollständiger. Ab Oracle 11.1.0.6 übernimmt DML für eine untergeordnete Tabelle jedoch eine DML-Sperre im SX-Modus für die übergeordnete Tabelle. Siehe Oracle-Support-Hinweis 5909305.8. –

+0

Bitte teilen Sie den Link für den Punkt, auf den Sie sich beziehen. –

+0

Ich kann den Link nicht teilen - der Support-Hinweis ist nur über die Support-Website von Oracle zugänglich. Ihre Oracle-Lizenz sollte Sie dazu berechtigen, sich dort zu registrieren. –

Antwort

2

Es hängt davon ab, was Sie mit den ausgewählten Daten tun. Ihr Cursor enthält die Fremdschlüsselspalte A.EVENTTYPCD. Wenn Ihr Prozess die Spalte aktualisiert werden Sie Reihe exklusiv (RX) AKA subexclusive Tabelle (SX) Sperren auf der übergeordneten Tabelle sehen:

LOCK_TYPE LMODE   OBJECT_NAME 
--------- ------------- -------------- 
TM   row-X (SX)  EVENTTYPTABLE1 
TM   row-X (SX)  EVENTTYPTABLE1 
TM   row-X (SX)  TABLE1 
TM   row-X (SX)  TABLE1 
TX   exclusive (X)  

Aber wenn der Prozess nicht den Fremdschlüssel nicht berührt werden Sie nicht

LOCK_TYPE LMODE   OBJECT_NAME 
--------- ------------- -------------- 
TM   row-X (SX)  TABLE1 
TX   exclusive (X) 

Oracle eingeführt dieses Verhalten in 11.1.0.6.to einen Fehler beheben. Es ist in einem Oracle Support Note, 5909305.8 dokumentiert. Es ist ein Verstoß gegen Oracle Support T & Cs, Support-Hinweise (oder andere MOS-Material) ohne Erlaubnis von Oracle zu veröffentlichen, aber Sie sollten Googeln dafür versuchen;)