It's me ;-)

Lỗi deadlock khi sử dụng Laravel database queue

Dạo gần đây product toàn báo lỗi dạng này:

[2020-09-25 10:18:54] production.ERROR: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction (SQL: delete from `jobs` where `id` = 4632) {“exception”:”[object] (Illuminate\\Database\\QueryException(code: 40001): SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction (SQL: delete from `jobs` where `id` = 4632) at /var/www/html/xxx/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664, Doctrine\\DBAL\\Driver\\PDOException(code: 40001): SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction at /var/www/html/xxx/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:119, PDOException(code: 40001): SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction at /var/www/html/p501/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:117)

Rõ ràng là mình có sử dụng transaction và các job chạy cũng không nặng nề gì vậy mà job fail cứ tăng liên tục 🙁

Sau một hồi search siếc thì thấy có thằng cũng bị giống như mình, đặc biệt là đoạn thảo luận =))

Tóm váy lại là bạn có nhiều job, nhiều worker cũng không quan trọng, nhưng nếu bạn chọc 2 application vào chung 1 DB queue (dù queue name có khác nhau đi nữa) thì lỗi deadlock này chắc chắn xảy ra.

Để sửa lỗi này không còn cách nào khác ngoài chuyển sang sử dụng queue driver khác (ở đây mình xài SQS). Sau khi đổi thì chả thấy lỗi đó xảy ra nữa.

Đúng là đã nhiều worker lại từ 2 app chọc đồng thời thì fail thật sự 🤪

Leave a Reply

Your email address will not be published. Required fields are marked *