Vấn đề là bạn đang cố gắng tìm nạp qua một cam kết.
Khi bạn mở My_Data_Cur
với for update
, Oracle phải khóa mọi hàng trong My_Data_1
bảng trước khi nó có thể trả về bất kỳ hàng nào. Khi bạn commit
, Oracle phải giải phóng tất cả các khóa đó (các khóa mà Oracle tạo ra không mở rộng các giao dịch). Vì con trỏ không còn có các khóa mà bạn yêu cầu, Oracle phải đóng con trỏ vì nó không còn đáp ứng được for update
mệnh đề. Do đó, lần tìm nạp thứ hai phải trả về 0 hàng.
Cách tiếp cận hợp lý nhất hầu như luôn luôn là loại bỏ commit
và thực hiện toàn bộ công việc trong một giao dịch duy nhất. Nếu bạn thực sự, thực sự, thực sự cần các giao dịch riêng biệt, bạn sẽ cần mở và đóng con trỏ cho mỗi lần lặp lại của vòng lặp. Rất có thể, bạn muốn làm điều gì đó để hạn chế con trỏ chỉ trả về 100 hàng mỗi khi nó được mở (tức là rownum <= 100
) để bạn không phải chịu chi phí truy cập vào từng hàng để đặt khóa và sau đó là mọi hàng khác với hàng 100 mà bạn đã xử lý và xóa để mở khóa mọi lúc qua vòng lặp.