Thứ nhất: MySQL là một trong những phần mềm tồi tệ nhất có thể để thực hiện điều này, đặc biệt nếu nó rất năng động. Lý do là các công cụ như MEMORY và MyISAM chỉ có khóa toàn bảng trong khi các công cụ phù hợp hơn như InnoDB có mức phạt ghi cao hơn (để cung cấp các thuộc tính ACID) và được tối ưu hóa để truy cập các bản ghi gần đúng về mặt không gian và thời gian (được đặt trên bộ nhớ ). Cũng không có một hệ thống thông báo thay đổi tốt cho MySQL - nó phải được thực hiện như một cuộc bỏ phiếu. Có hàng tá phần mềm được tối ưu hóa hơn cho nhiệm vụ đó .
Phải nói rằng, tôi đã thấy thực hiện thành công loại truy cập này nếu các yêu cầu về hiệu suất / hiệu quả không cao lắm. Nhiều người không thể đủ khả năng để giới thiệu và duy trì một phần công nghệ hoàn toàn riêng biệt chỉ cho một phần nhỏ của logic kinh doanh.
SELECT FOR UPDATE
là những gì bạn đang tìm kiếm - đọc serialization. Mặc dù CẬP NHẬT / XÓA sẽ luôn khóa hàng trong khi giao dịch MYSQL đang chạy, bạn có thể muốn tránh một giao dịch lớn trong khi quá trình đang diễn ra, vì vậy:
START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING'
ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;
// row is processed here, outside of the transaction, and it can take as much time as we want
// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}
MySQL sẽ đảm nhiệm việc khóa tất cả các lựa chọn đồng thời trừ một khi chọn hàng. Vì điều này có thể dẫn đến nhiều kết nối bị khóa cùng một lúc, giữ cho giao dịch ban đầu càng nhỏ càng tốt và cố gắng xử lý nhiều hơn 1 hàng đó cùng một lúc.