A SELECT FOR UPDATE
khóa hàng bạn đã chọn để cập nhật cho đến khi giao dịch bạn tạo kết thúc. Các giao dịch khác chỉ có thể đọc hàng đó nhưng chúng không thể cập nhật hàng miễn là giao dịch chọn để cập nhật vẫn mở.
Để khóa (các) hàng:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Giao dịch ở trên sẽ vẫn tồn tại và sẽ khóa hàng cho đến khi giao dịch được cam kết.
Để kiểm tra nó, có nhiều cách khác nhau. Tôi đã thử nghiệm nó bằng cách sử dụng hai phiên bản đầu cuối với máy khách MySQL được mở trong mỗi phiên bản.
Trên first terminal
bạn chạy SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Trên second terminal
bạn có thể thử cập nhật hàng:
UPDATE test SET parent = 100 WHERE id = 4;
Vì bạn tạo một lựa chọn để cập nhật trên first terminal
truy vấn ở trên sẽ đợi cho đến khi giao dịch chọn để cập nhật được cam kết hoặc nó sẽ hết thời gian chờ.
Quay lại first terminal
và thực hiện giao dịch:
COMMIT;
Kiểm tra second terminal
và bạn sẽ thấy rằng truy vấn cập nhật đã được thực thi (nếu nó không hết thời gian chờ).