UPDATE
khóa hàng, vì vậy bạn không cần phải khóa hàng trước. Nếu bạn cố gắng UPDATE
tập hợp các hàng chồng chéo đồng thời, UPDATE
thứ hai sẽ đợi giao dịch của người đầu tiên cam kết hoặc quay trở lại.
Vấn đề lớn với cách tiếp cận của bạn - ngoài thực tế là UPDATE
không có LIMIT
mệnh đề - là nhiều công nhân sẽ cố gắng lấy các hàng giống nhau. Đây là những gì sẽ xảy ra:
- worker1:Lọc bảng để tìm 200 hàng và khóa chúng
- worker1:bắt đầu cập nhật các hàng
- worker2:lọc bảng để tìm 200 hàng
- worker2:cố gắng bắt đầu cập nhật các hàng, nhưng đã chọn các hàng giống như worker1 nên nó chặn trên khóa của worker1
- worker1:Hoàn thành việc cập nhật các hàng
- worker2:Sau khi phát hành khóa, hãy kiểm tra lại điều kiện WHERE và phát hiện ra rằng không có hàng nào khớp nữa vì worker1 đã cập nhật chúng. Cập nhật không có hàng nào.
... và lặp lại!
Bạn cần:
- Có hàng đợi trung tâm phân phối các hàng theo cách an toàn đồng thời thích hợp; hoặc
- Chỉ định cho nhân viên các dải ID không trùng lặp để làm việc
Đối với LIMIT
- bạn có thể sử dụng WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- nhưng bạn có cùng vấn đề với cả hai công nhân khi chọn cùng một nhóm hàng để cập nhật.