SELECT FOR UPDATE
có được một ổ khóa dành riêng cho mục đích trên bàn trước khi có được ổ khóa độc quyền trên hồ sơ.
Do đó, trong trường hợp này:
X1: SELECT FOR UPDATE -- holds IX, holds X on 'lock_name'
X2: SELECT FOR UPDATE -- holds IX, waits for X on 'lock_name'
X1: INSERT -- holds IX, waits for X for the gap on `id`
xảy ra bế tắc vì cả hai giao dịch đang giữ IX
khóa trên bàn và đợi X
khóa hồ sơ.
Trên thực tế, rất kịch bản này được mô tả trong MySQL
hướng dẫn sử dụng khóa
.
Để giải quyết vấn đề này, bạn cần loại bỏ tất cả các chỉ mục ngoại trừ chỉ mục bạn đang tìm kiếm, đó là lock_name
.
Chỉ cần thả khóa chính vào id
.