2012-11-06 34 views

Trả lời

16

Sử dụng for update nowait sẽ khiến các hàng bận và nhận khóa cho đến khi thực hiện cam kết hoặc khôi phục. Bất kỳ phiên nào khác cố gắng lấy khóa sẽ nhận được thông báo lỗi Oracle như ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.

Session1:

CURSOR abc_cur 
IS 
select * from dept where deptno =10 for update nowait; 

đây các hàng bị khóa cho đến khi con trỏ được đóng cửa hoặc một cam/rollback được thực hiện. Nếu khi đó, một người dùng khác từ phiên 2 cố gắng truy cập các hồ sơ cùng thì điều này sẽ ném ra một lỗi như hình dưới đây:

Session2:

select * from dept where deptno =10 for update nowait; 

Thành viên này thậm chí còn không thể cập nhật hoặc xóa các hồ sơ tương tự đã bị khóa bởi phiên đầu tiên.

ERROR at line 1: 
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired` 

Cách sử dụng: Bây giờ nếu bạn muốn làm một số thao tác trên bộ nhất định hồ sơ và bạn không muốn người dùng khác từ phiên khác để ghi đè lên dữ liệu của bạn thì trước tiên bạn phải khóa các hồ sơ (sử dụng for update nowait) và sau đó thực hiện thao tác của bạn. Sau khi bạn hoàn tất thao tác, hãy đóng con trỏ và commit.

EDIT Giả sử trong phiên tôi 1 tôi đã thực hiện kịch bản sau đây:

declare 
cursor abc is select * from temp ; 
temp abc%rowtype; 
begin 
open abc; 
end; 

bây giờ trong phiên 2 Tôi thực

select * from temp ; 

0 rows found 

Nếu tôi thực thi kịch bản tương tự một lần nữa

declare 
cursor abc is select * from temp ; 
temp abc%rowtype; 
begin 
open abc; 
end; 

Sau đó, tôi nhận được ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.

+0

Vì vậy, nếu tôi không chờ đợi tôi thậm chí không thể tìm nạp (SELECT) cùng một hàng từ phiên khác, tôi có đúng không? – user1

+0

Nếu tôi muốn tìm nạp nhưng không cập nhật cùng một hàng từ một phiên khác, tôi nên xử lý như thế nào? – user1

+0

@ user1: có bạn có thể chọn các hàng tương tự từ phiên khác, nhưng bạn không thể khóa các hàng tương tự, nếu điều này bị khóa bởi một phiên khác. Bạn có thể tìm nạp các hàng từ phiên khác. –

Các vấn đề liên quan