Khóa MySQL gốc không cung cấp chức năng này. Bạn có thể sử dụng một cột để thực hiện "khóa" của mình.
Giả sử mỗi luồng có một ID duy nhất, bạn có thể tạo một cột có tên thread_owner
, với mặc định là 0.
Một chuỗi sẽ lấy một hàng như thế này:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
Sau đó, chọn hàng như thế này (nó có thể không trả về, nếu không có hàng nào được xử lý):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
Sau đó, xử lý và cuối cùng là xóa nó.
Giải pháp này sẽ hoạt động trên cả MyISAM và InnoDB.
Tuy nhiên, đối với InnoDB, nó có thể chậm vì mỗi câu lệnh UPDATE đang cố gắng khóa tất cả các hàng có thread_owner =0 và trừ khi bạn chắc chắn rằng mình đang khóa tất cả các hàng theo cùng một thứ tự mỗi lần, nó thậm chí có thể gây ra bế tắc. Vì vậy, bạn có thể thử khóa toàn bộ bảng một cách rõ ràng trong câu lệnh UPDATE của mình:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
Bằng cách đó, cả MyISAM và InnoDB sẽ hoạt động theo cùng một cách.