Nếu chạy tổng hợp bảng xếp hạng, gửi thư hàng loạt hay dọn dữ liệu cũ trong lúc đang vận hành, các tác vụ này sẽ chiếm khóa và ổ đĩa.
Vì sao Chạy tác vụ khối lượng lớn trong giờ vận hành → Dẫn đến Khóa phạm vi rộng, chiếm ổ đĩa và CPU → Trên màn hình Giao dịch và lưu thất bại vào một khung giờ nhất định, loading chậm
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)
Chia nhỏ để chạy từng ít một, tổng hợp trên bản sao.
Việc cần làm (Đội hạ tầng)
Cung cấp bản sao dành cho tổng hợp, lên lịch batch vào khung giờ vắng, theo dõi lock escalation và chờ gap lock.
Trên đồ thị
Vọt lên theo chu kỳ · Độ trễ query DB, chờ khóa
Chỗ cần xem
Tìm query dài đang chạy vào lúc lag. MySQL: xem slow query log; PostgreSQL: xem query_start, query trong pg_stat_activity; rồi đối chiếu với chỉ số chờ khóa cùng thời điểm và lịch batch (cron, event scheduler của DB). SQL Server: ghi lại lock escalation bằng extended event lock_escalation
Đúng nếu
lần nào cũng vào cùng một giờ có UPDATE, DELETE hoặc query tổng hợp khối lượng lớn chạy, và trong lúc đó chờ khóa cùng mức sử dụng ổ đĩa đều tăng
Loại trừ nếu
lúc đó không có query dài nào → checkpoint (db-checkpoint) hoặc sao lưu server (dk-backup)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
SQL Server đổi sang khóa cả bảng khi một câu lệnh giữ quá khoảng 5.000 khóa dòng (lock escalation). Ngay lúc đó, mọi yêu cầu dùng cùng bảng đều bị dừng. MySQL với cấu hình mặc định, khi sửa theo điều kiện phạm vi, cũng khóa cả khoảng trống giữa các dòng (gap lock), chặn việc thêm dòng mới.
Nguồn
Transaction Locking and Row Versioning GuideMicrosoft SQL Server Khi một câu lệnh giữ từ 5.000 khóa trở lên trên một bảng (hoặc index) thì xảy ra lock escalation, được ghi lại bằng extended event lock_escalation
InnoDB LockingMySQL Ở mức cô lập mặc định REPEATABLE READ của InnoDB, tìm kiếm và quét dùng next-key lock, nên gap lock chặn việc thêm dòng mới vào khoảng trống đó
The Slow Query LogMySQL Ghi các query vượt long_query_time kèm thời gian chạy (Query_time), thời gian khóa (Lock_time), số dòng đã đọc