sự khác biệt chính xác giữa hai khóa là gì đọc các điều khoản:MySQL InnoDB: Sự khác biệt giữa 'CHO UPDATE` và' KHÓA TRÊN SHARE MODE`
SELECT ... FOR UPDATE
và
SELECT ... LOCK IN SHARE MODE
Và tại sao bạn cần phải sử dụng cái khác?
sự khác biệt chính xác giữa hai khóa là gì đọc các điều khoản:MySQL InnoDB: Sự khác biệt giữa 'CHO UPDATE` và' KHÓA TRÊN SHARE MODE`
SELECT ... FOR UPDATE
và
SELECT ... LOCK IN SHARE MODE
Và tại sao bạn cần phải sử dụng cái khác?
Tôi đã cố gắng hiểu sự khác biệt giữa hai điều này. Tôi sẽ ghi lại những gì tôi đã tìm thấy với hy vọng nó sẽ hữu ích cho người tiếp theo.
Cả hai LOCK IN SHARE MODE
và FOR UPDATE
đảm bảo không có giao dịch nào khác có thể cập nhật các hàng được chọn. Sự khác biệt giữa hai là cách họ xử lý các khóa trong khi đọc dữ liệu.
LOCK IN SHARE MODE
không ngăn giao dịch khác đọc cùng hàng bị khóa.
FOR UPDATE
ngăn các lần đọc khóa khác của cùng một hàng (đọc không khóa vẫn có thể đọc hàng đó; LOCK IN SHARE MODE
và FOR UPDATE
là khóa lần đọc).
Vấn đề này trong các trường hợp như cập nhật bộ đếm, trong đó bạn đọc giá trị trong 1 câu lệnh và cập nhật giá trị trong một câu lệnh khác. Ở đây, sử dụng LOCK IN SHARE MODE
sẽ cho phép 2 giao dịch đọc cùng một giá trị ban đầu. Vì vậy, nếu bộ đếm được tăng lên 1 bởi cả hai giao dịch, số kết thúc có thể chỉ tăng 1 - vì cả hai giao dịch ban đầu đều đọc cùng một giá trị.
Sử dụng FOR UPDATE
sẽ khóa giao dịch thứ 2 khỏi đọc giá trị cho đến khi giá trị đầu tiên được thực hiện. Điều này sẽ đảm bảo bộ đếm được tăng thêm 2.
Theo https://dev.mysql.com/doc/refman /5.7/en/innodb-locking-reads.html "ít nhất một trong số chúng kết thúc bằng bế tắc" - không tăng số lượt truy cập bằng 1 thay vì 2 như bạn đã nêu. Bất kỳ ý tưởng tại sao bế tắc có thể xảy ra? –
có thể trùng lặp của ["FOR UPDATE" v/s "LOCK IN SHARE MODE": Cho phép các chủ đề đồng thời đọc cập nhật "trạng thái" giá trị của hàng bị khóa] (http: // stackoverflow.com/questions/9037345/for-update-vs-lock-in-share-mode-allow-concurrent-threads-to-read-updated) –