Cách khắc phục MySQL ERROR 1213: Deadlock Found When Trying to Get Lock

intermediate🗄️ MySQL2026-04-12| MySQL 5.7+, MySQL 8.0+, MariaDB, Linux (Ubuntu/CentOS), Docker, AWS RDS, Google Cloud SQL.

Error Message

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
#mysql#deadlock#tối-ưu-hóa-database#innodb#hiệu-suất-sql

Thông báo lỗi

Trong các ứng dụng có lưu lượng truy cập cao, bạn có thể thấy các hoạt động cơ sở dữ liệu của mình đột ngột thất bại với thông báo cụ thể này:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

Deadlock chính xác là gì?

Deadlock về cơ bản là một tình trạng "tiến thoái lưỡng nan" giữa các tiến trình cơ sở dữ liệu. Nó xảy ra khi Transaction A đang giữ khóa (lock) trên Hàng 1 và muốn lấy Hàng 2, trong khi Transaction B đang giữ khóa trên Hàng 2 và muốn lấy Hàng 1. Cả hai đều không thể tiến tiếp.

MySQL không chỉ treo mãi mãi. Nó phát hiện ra sự bế tắc và hủy bỏ một trong các transaction — gọi là "nạn nhân" (victim) — để transaction kia có thể hoàn tất. Đây không phải là lỗi trong engine InnoDB. Đó là một biện pháp bảo vệ để giữ cho cơ sở dữ liệu của bạn luôn phản hồi, mặc dù các deadlock thường xuyên xảy ra thường là dấu hiệu của những thiếu sót trong logic ứng dụng của bạn.

Các bước khắc phục

1. Triển khai logic thử lại (Retry) ở cấp ứng dụng

Thông báo lỗi khá sát nghĩa: "try restarting transaction" (hãy thử khởi động lại transaction). Trong các hệ thống có tính đồng thời cao, deadlock đôi khi là không thể tránh khỏi. Mã nguồn của bạn nên lường trước lỗi này và thử thực hiện lại thao tác sau một khoảng dừng ngắn.

Dưới đây là một mô hình thử lại thực tế sử dụng cơ chế exponential backoff (theo phong cách Node.js/Python):

max_retries = 3
retries = 0

while retries  100` nguy hiểm hơn nhiều so với việc khóa `WHERE id IN (101, 102, 103)`.
  - **Batching (Chia nhỏ):** Nếu bạn cần cập nhật 10.000 hàng, hãy thực hiện theo từng đợt 100 hoặc 500 hàng. Việc này giúp giải phóng khóa nhanh hơn và ngăn một transaction lớn duy nhất làm nghẽn toàn bộ hệ thống.

Related Error Notes