Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Deadlock Detection qua PHP

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHÈN và CẬP NHẬT trong một truy vấn MYSQL

  2. Lời khuyên về cấu trúc hệ thống bình luận

  3. Phiên bản MySQL nào tương thích với phiên bản Airflow 1.10?

  4. Kích hoạt trình kích hoạt sau khi cập nhật các cột cụ thể trong MySQL

  5. Cách đọc tham số cấu hình cơ sở dữ liệu bằng cách sử dụng tệp thuộc tính trong chế độ ngủ đông