Tôi có một cơ sở dữ liệu Oracle mà tôi truy cập bằng Devart và Entity Framework.Đọc và cập nhật đồng thời trong một bảng cơ sở dữ liệu
Có một bảng gọi là IMPORTJOBS
với một cột STATUS
.
Tôi cũng có nhiều quy trình đang chạy cùng một lúc. Mỗi người đọc hàng đầu tiên trong số IMPORTJOBS
có trạng thái 'REGISTERED'
, đặt nó vào trạng thái 'EXECUTING'
và nếu được đặt thành trạng thái 'EXECUTED'
.
Bây giờ, vì các quá trình đang chạy song song, tôi tin rằng những điều sau có thể xảy ra:
- quá trình A đọc hàng 10 trong đó có tình trạng
REGISTERED
, - quá trình B cũng đọc hàng 10 trong đó có vẫn tình trạng
REGISTERED
, - quy trình Cập nhật hàng 10 đến trạng thái
EXECUTING
.
Quy trình B không thể đọc hàng 10 làm quy trình A đã đọc và sẽ cập nhật trạng thái của nó.
Tôi nên giải quyết vấn đề này bằng cách nào? Đặt đọc và cập nhật trong một giao dịch? Hoặc tôi nên sử dụng một số cách tiếp cận phiên bản hoặc cái gì khác?
Cảm ơn!
CHỈNH SỬA: nhờ câu trả lời được chấp nhận, tôi đã làm việc đó và ghi lại ở đây: http://ludwigstuyck.wordpress.com/2013/02/28/concurrent-reading-and-writing-in-an-oracle-database.
cảm ơn bạn, tôi đang cố gắng thực thi "SELECT * FROM IMPORTJOBS WHERE STATUSCODE = 'ĐĂNG KÝ' VÀ ROWNUM <= 1 FOR UPDATE SKIP LOCKED", nhưng nó vẫn trả về cùng một hàng từ các quy trình khác nhau? –
(1) đảm bảo rằng bạn đã tắt tính năng tự động tắt: bạn không thể khóa một hàng mà không có giao dịch. (2) 'CHO CẬP NHẬT SKIP LOCKED' và' rownum' [sẽ không hoạt động như bạn mong đợi] (http://stackoverflow.com/questions/5847228/oracle-select-for-update-behaviour) - điều này là bởi vì SKIP LOCKED được đánh giá ** sau ** mệnh đề WHERE. Sử dụng lựa chọn không có rownum, tìm nạp một hàng (hoặc nhiều hơn khi cần thiết) và đóng con trỏ, đó là cách tốt nhất để sử dụng SKIP LOCKED. –
thực sự, tôi đã phải đặt lựa chọn và cập nhật trong một giao dịch, bây giờ nó hoạt động. Cảm ơn!!! –