Khi hai transaction (nhóm thao tác DB được xử lý như một khối) chờ dòng mà bên kia đã khóa, DB buộc phải hủy một bên.
Vì sao Giao dịch A khóa theo thứ tự vật phẩm→tiền tệ, B khóa theo thứ tự tiền tệ→vật phẩm → Dẫn đến DB phát hiện deadlock và rollback một bên → Trên màn hình Giao dịch và chế tạo thỉnh thoảng thất bại, vật phẩm bị trả lại
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng DB (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Thống nhất thứ tự khóa, giữ transaction ngắn, tự động thử lại khi thất bại.
Việc cần làm (Đội hạ tầng)
Bật phát hiện deadlock, thu thập bản ghi deadlock và chia sẻ; với MySQL server đã tắt phát hiện, giảm giới hạn thời gian chờ khóa (mặc định 50 giây).
Con số tham khảo
Thời gian đến khi phát hiện: MySQL (InnoDB) gần như ngay lập tức, PostgreSQL mặc định 1 giây, SQL Server tối đa khoảng 5 giây. Trong lúc đó cả hai yêu cầu đều bị dừng. Nếu server tắt tính năng phát hiện của MySQL vì yêu cầu đồng thời quá nhiều, thì phải chờ tới giới hạn thời gian chờ khóa (mặc định 50 giây).
Trên đồ thị
Thỉnh thoảng vọt lên bất chợt · Số deadlock, số giao dịch thất bại
Chỗ cần xem
MySQL: xem LATEST DETECTED DEADLOCK trong SHOW ENGINE INNODB STATUS (chỉ 1 lần gần nhất), mọi deadlock được ghi vào error log khi bật innodb_print_all_deadlocks, lock_deadlocks trong INFORMATION_SCHEMA.INNODB_METRICS. PostgreSQL: xem deadlocks trong pg_stat_database. SQL Server: xem xml_deadlock_report của session system_health (bật sẵn mặc định). Mã lỗi phía server game: MySQL 1213, PostgreSQL 40P01, SQL Server 1205
Đúng nếu
vào lúc giao dịch hoặc chế tạo thất bại, số deadlock tăng, và hai transaction được ghi lại đang khóa cùng các bảng theo thứ tự ngược nhau
Loại trừ nếu
số deadlock không đổi mà vẫn thất bại → vượt giới hạn chờ khóa (lỗi MySQL 1205) hoặc hot row (db-hot-row)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Deadlocks guideMicrosoft SQL Server Chu kỳ kiểm tra deadlock mặc định 5 giây, giảm xuống tới 100 ms nếu deadlock xảy ra thường xuyên; session system_health bật sẵn mặc định thu thập xml_deadlock_report; bên bị chọn hủy nhận lỗi 1205
How to Minimize and Handle DeadlocksMySQL Luôn sửa nhiều dòng, nhiều bảng theo cùng một thứ tự, thất bại thì thử lại, dùng innodb_print_all_deadlocks để ghi mọi deadlock