Một bế tắc trả về lỗi 1213
mà bạn nên xử lý ở phía khách hàng
Lưu ý rằng bế tắc và chờ khóa là những thứ khác nhau. Trong lúc bế tắc, không có giao dịch nào "thất bại":cả hai đều có tội. Không có gì đảm bảo cái nào sẽ được khôi phục.
Bế tắc xảy ra trong trường hợp như sau:
UPDATE t_first -- transacion 1 locks t_first
SET id = 1;
UPDATE t_second -- transaction 2 locks t_second
SET id = 2;
UPDATE t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET id = 2;
UPDATE t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET id = 2;
Bạn có chắc là mình không nhầm lẫn với việc chờ khóa không?
Chờ khóa xảy ra bất cứ khi nào một giao dịch cố gắng khóa một tài nguyên đã bị khóa bởi một giao dịch khác.
Trong ví dụ trên, khóa chờ xảy ra ở bước 3
.
Vì đây là một tình huống bình thường (không giống như bế tắc), có thể được giải quyết từ bên ngoài bằng cách cam kết hoặc quay lại giao dịch giữ khóa, InnoDB
sẽ không cố gắng khôi phục giao dịch bị khóa.
Thay vào đó, nó sẽ chỉ hủy câu lệnh đã cố gắng lấy khóa sau khi thời gian chờ xảy ra.
Thời gian chờ theo mặc định là 50
giây và được đặt bằng innodb_lock_wait_timeout
.
Tuyên bố không thành công (đã cố gắng lấy được khóa) sẽ trả về lỗi 1205
.