Chạy một công việc xử lý theo nhiều đợt song song về cơ bản đọc một số lượng lớn các hàng để cập nhật một số - ở đây sử dụng mức giao dịch thấp hơn vì tôi biết các giá trị liên quan sẽ không được cập nhật trong khi tác vụ này đang chạy trước khi gọi từng lưu trữ Tôi chạy:
set session transaction isolation level read uncommitted
sau đó gọi Proc được lưu trữ để có một tập hợp con ID để xử lý. SQLFiddle của hoạt động tổng thể: http://sqlfiddle.com/#!9/192d62 (hơi bị chiếm đoạt nhưng giữ nguyên cấu trúc của các truy vấn ban đầu)
Lý do tôi hỏi là sự bế tắc tiếp tục xảy ra và nhìn vào đầu ra Màn hình có một luồng yêu cầu khóa chung trong khi một luồng khác giữ khóa độc quyền trên cùng một không gian (hoặc ngược lại) - không nên đặt mức giao dịch đó ngăn chặn nhu cầu cho một khóa chia sẻ? Có một lý do để có được một khóa chia sẻ ngoài repeatable-read
?
Sử dụng InnoDB.
Thông tin khóa có liên quan từ show engine innodb status
(được chỉnh sửa để khớp với tên bảng từ SQLFiddle):
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 481628 page no 24944 n bits 112 index `PRIMARY` of table `events` trx id 27740892 lock mode S locks rec but not gap waiting
và
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 481628 page no 24944 n bits 112 index `PRIMARY` of table `events` trx id 27740898 lock_mode X locks rec but not gap waiting
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 481628 page no 25267 n bits 112 index `PRIMARY` of table `events` trx id 27740898 lock_mode X locks rec but not gap waiting
Lưu ý rằng truy vấn 1 và 2 trong SQLFiddle khớp với các mục nhập thứ nhất và thứ hai trong đầu ra của công cụ. Các PRIMARY
Điều quan trọng là duy nhất trong id
cột (như có thể thấy trong Fiddle)