한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L12 Cơ sở dữ liệu

Deadlock trong DB Database deadlock

ID nguyên nhân db-deadlock · 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)

Mở thẻ gốc có hình minh họa và thí nghiệm →

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

Triệu chứng
Nuốt thao tác·rollback, Trễ thao tác
Yếu tố
Mất gói, Ngưng trệ
Ai gặp phải
Chỉ một tính năng
Khi nào
Khi đông người, Khi làm một thao tác nhất định
Phụ trách
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)

Nguồn

  1. InnoDB Startup Options and System Variables MySQL
    Khi bật phát hiện (mặc định), InnoDB phát hiện deadlock ngay và rollback; innodb_lock_wait_timeout mặc định 50 giây
  2. Deadlock Detection MySQL
    Khi mức đồng thời rất cao, bản thân việc phát hiện có thể chậm đi, nên đôi khi người ta tắt nó và dựa vào giới hạn chờ khóa
  3. Lock Management (PostgreSQL Documentation) PostgreSQL
    deadlock_timeout mặc định 1 giây: chỉ sau khi chờ khóa chừng ấy mới kiểm tra deadlock
  4. Deadlocks guide Microsoft 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
  5. How to Minimize and Handle Deadlocks MySQL
    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
  6. InnoDB Standard Monitor and Lock Monitor Output MySQL
    LATEST DETECTED DEADLOCK: hai transaction của deadlock gần nhất, khóa đã giữ và khóa đang chờ, bên bị rollback
  7. InnoDB INFORMATION_SCHEMA Metrics Table MySQL
    Counter lock_deadlocks trong INNODB_METRICS (bật mặc định)
  8. Server Error Message Reference MySQL
    1213 ER_LOCK_DEADLOCK (deadlock), 1205 ER_LOCK_WAIT_TIMEOUT (vượt giới hạn chờ khóa)
  9. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    deadlocks trong pg_stat_database: số deadlock đã phát hiện trong DB này
  10. PostgreSQL Error Codes (PostgreSQL Documentation) PostgreSQL
    40P01 deadlock_detected

Nguyên nhân nên xem cùng

Cùng tầng: L12 Cơ sở dữ liệu

Nguyên nhân ở tầng khác gây cùng triệu chứng (Nuốt thao tác·rollback)

Xem thẻ gốc có hình minh họa và thí nghiệm