Tôi đang viết một dịch vụ nền cần xử lý một loạt công việc, được lưu trữ dưới dạng bản ghi trong bảng sqlserver. Dịch vụ cần tìm 20 công việc lâu đời nhất cần được làm việc (where status = 'new'
), đánh dấu chúng (set status = 'processing'
), chạy chúng và cập nhật công việc sau đó.Đánh dấu nguyên tử và trả về một nhóm hàng trong cơ sở dữ liệu
Đó là phần đầu tiên tôi cần trợ giúp. Có thể có nhiều chuỗi truy cập cơ sở dữ liệu cùng một lúc và tôi muốn đảm bảo rằng truy vấn "đánh dấu & trả về" chạy nguyên tử hoặc gần như vậy.
Dịch vụ này sẽ dành ít thời gian truy cập cơ sở dữ liệu và không phải là kết thúc của thế giới nếu công việc được chạy hai lần, vì vậy tôi có thể chấp nhận một xác suất nhỏ của công việc chạy nhiều lần trong mã.
Cách tốt nhất để làm điều này là gì? Tôi đang sử dụng linq-to-sql cho lớp dữ liệu của tôi, nhưng tôi giả sử tôi sẽ phải thả xuống t-sql cho việc này.
Bạn có thể giải thích tại sao sẽ có deadlocks nếu bảng không được nhóm lại (trạng thái, enqueue_time) ngay cả sau khi sử dụng 3 gợi ý bạn quy định? –
Tôi không biết về mệnh đề OUTPUT, cùng với các gợi ý tạo ra một giải pháp hoàn chỉnh. Điều này trả lời câu hỏi của riêng tôi tại SO. –