Điều gì tạo nên sự khác biệt, khi tôi sử dụng FOR UPDATE OF SAL
hoặc chỉ cần viết FOR UPDATE
.Sự khác biệt giữa CẬP NHẬT VÀ CẬP NHẬT
Theo O'Reilly
Các HÀNH danh sách các khoản CẬP NHẬT CHO không hạn chế bạn thay đổi chỉ những cột liệt kê. Khóa vẫn được đặt trên tất cả các hàng; danh sách OF chỉ cung cấp cho bạn một cách để ghi rõ hơn những gì bạn dự định thay đổi . Nếu bạn chỉ đơn giản là trạng thái FOR UPDATE trong truy vấn và không bao gồm một hoặc nhiều cột sau từ khóa OF, thì cơ sở dữ liệu sau đó sẽ khóa tất cả các hàng đã xác định trên tất cả các bảng được liệt kê trong mệnh đề FROM.
Có nghĩa là, khi tôi chỉ định tên cột với FOR UPDATE OF SAL
, người dùng khác chỉ có thể thay đổi với cột SAL
. Nhưng, thực tế, đây không phải là trường hợp. Tôi vẫn bị khóa trong phiên khác. Bất cứ ai có thể giải thích sự khác biệt.
CẬP NHẬT
----- SESSION 1
declare
emp_info emp.ename%type;
cursor emp_cur is select ename from emp join dept using(deptno) where deptno=&no for update of sal;
begin
open emp_cur;
loop
fetch emp_cur into emp_info;
exit when emp_cur%notfound;
dbms_output.put_line(emp_info);
end loop;
close emp_cur;
end;
----- SESSION 2
update emp set comm=5 where deptno=10;
---- hanged/waiting in session 2
Không, ý tôi muốn nói là, nó sẽ cho phép tôi cập nhật khi tôi sẽ cố cập nhật cột khác. Thậm chí, tôi tham gia hai bảng, nhưng vẫn kịch bản tương tự. Vui lòng kiểm tra bài đăng cập nhật của tôi và vui lòng giải thích. – Ravi
@jWeavers - bạn không thể cập nhật một cột trong bảng nếu bảng đó không có tham chiếu trong mệnh đề 'OF'. Sử dụng 'WHERE CURRENT OF', dù sao thì không có gì ngăn bạn cập nhật bất cứ thứ gì bạn thích với một' UPDATE' bình thường mà không có mệnh đề đó - bao gồm trong các bảng bạn đã khóa với 'FOR UPDATE', vì bạn giữ khóa đó. –
@jWeavers - từ bản cập nhật của bạn: phải, bạn đã khóa hàng ** ** trong 'emp', vì vậy phiên thứ hai phải đợi phiên đầu tiên giải phóng khóa (' commit'/'rollback'), mặc dù không có cập nhật nào được thực hiện. Phiên thứ hai của bạn vẫn có thể cập nhật 'dept', vì không có cột nào từ bảng đó nằm trong mệnh đề' OF'. –