2015-09-28 17 views
6

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 

SELECT ... LOCK IN SHARE MODE 

Và tại sao bạn cần phải sử dụng cái khác?

+0

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) –

Trả lời

13

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 MODEFOR 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 MODEFOR 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.

+0

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ác vấn đề liên quan