Dari dokumentasi Oracle :
Jika kueri Anda merujuk pada satu tabel, maka tidak ada perbedaan antara FOR UPDATE
dan FOR UPDATE OF ...
, tetapi yang terakhir mungkin masih berguna sebagai dokumentasi mandiri untuk menunjukkan kolom mana yang ingin Anda perbarui. Itu tidak membatasi apa yang dapat Anda perbarui. Jika Anda memiliki:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
maka Anda masih dapat melakukan:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Tapi jika ada lebih dari satu tabel maka FOR UPDATE OF ...
hanya akan mengunci baris dalam tabel yang berisi kolom yang Anda tentukan di OF
klausa.
Bertentangan dengan apa yang saya pikir Anda katakan dalam pertanyaan. menentukan FOR UPDATE OF sal
tidak hanya mengunci sal
kolom; Anda tidak akan pernah bisa mengunci satu kolom, kunci minimum ada di tingkat baris. (Baca selengkapnya tentang kunci
). Itu mengunci semua baris dalam tabel yang berisi SAL
kolom, yang dipilih oleh kueri.
Dalam pembaruan pertanyaan Anda, kueri kursor Anda bergabung dengan emp
dan dept
, tetapi OF
klausa hanya memiliki sal
, kolom di emp
meja. Baris dalam emp
tabel akan dikunci saat kursor dibuka, dan kunci tersebut tidak akan dilepaskan sampai Anda commit
atau rollback
sesi itu. Dalam lingkaran kursor, Anda dapat melakukan:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... untuk memperbarui baris di emp
tabel yang berhubungan dengan iterasi loop ini. Anda tidak bisa lakukan:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... karena baris di dept
tabel tidak dikunci, karena tidak ada kolom di OF
. Itu juga berarti bahwa dalam sesi kedua Anda dept
baris dapat diperbarui secara bebas, karena tidak dikunci pada sesi pertama.