Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Unterschied zwischen FOR UPDATE OF und FOR UPDATE

Aus der Oracle-Dokumentation :

Wenn Ihre Abfrage auf eine einzelne Tabelle verweist, gibt es keinen Unterschied zwischen FOR UPDATE und FOR UPDATE OF ... , aber letzteres kann immer noch als Selbstdokumentation nützlich sein, um anzugeben, welche Spalten Sie aktualisieren möchten. Es schränkt jedoch nicht ein, was Sie aktualisieren können. Wenn Sie Folgendes haben:

CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;

dann kannst du immer noch:

UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;

Aber wenn es mehr als eine Tabelle gibt, dann FOR UPDATE OF ... sperrt nur die Zeilen in den Tabellen, die die Spalten enthalten, die Sie im OF angeben Klausel.

Im Gegensatz zu dem, was Sie meiner Meinung nach in der Frage sagen. Angabe von FOR UPDATE OF sal sperrt nicht nur den sal Säule; Sie können niemals eine einzelne Spalte sperren, die Mindestsperre liegt auf Zeilenebene. (Lesen Sie mehr über Sperren ). Es sperrt alle Zeilen in der Tabelle, die den SAL enthalten Spalte, die von der Abfrage ausgewählt werden.

In der Aktualisierung Ihrer Frage schließt sich Ihre Cursorabfrage emp an und dept , aber der OF -Klausel hat nur sal , eine Spalte im emp Tisch. Die Zeilen in emp Die Tabelle wird gesperrt, wenn der Cursor geöffnet wird, und diese Sperren werden nicht aufgehoben, bis Sie commit ausführen oder rollback diese Sitzung. Innerhalb Ihrer Cursorschleife können Sie Folgendes tun:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... um die Zeile im emp zu aktualisieren Tabelle, die sich auf diese Iteration der Schleife bezieht. Das können Sie nicht tun:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... weil Zeilen in der dept Tabelle sind nicht gesperrt, weil keine Spalten im OF waren . Das bedeutet auch, dass in Ihrer zweiten Sitzung die dept Zeilen können frei aktualisiert werden, da sie nicht durch die erste Sitzung gesperrt sind.