Tôi đang sử dụng Laravel 5.1.Làm thế nào để tránh các vấn đề về khóa bảng DB khi sử dụng hàng đợi Laravel?
Hàng đợi được sử dụng để tìm nạp/đồng bộ hóa dữ liệu giữa một số hệ thống.
Tôi sử dụng trình điều khiển cơ sở dữ liệu, 3 "hàng đợi nghệ nhân: công việc --daemon" quy trình đang chạy mọi lúc.
Các công việc được gửi bởi cả người dùng hệ thống và người lên lịch (cron). Ba hàng đợi được sử dụng để ưu tiên các công việc.
Mọi thứ dường như chỉ hoạt động tốt - bảng công việc được lấp đầy với các bản ghi, hệ thống sẽ xử lý chúng và loại bỏ các bản ghi được thực hiện.
vấn đề Tuy nhiên sau một thời gian khóa đang bắt đầu can thiệp:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
và
'RuntimeException' with message 'Can't swap PDO instance while within transaction.'
và
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
tôi đã không cố gắng sử dụng một tài xế đợi được nêu ra. Tôi thực sự muốn ở lại với cơ sở dữ liệu mặc dù. Động cơ là InnoDB, bảng công việc có cấu trúc và chỉ mục mặc định.
Có cách nào để giải quyết vấn đề này không? Quan điểm của bạn là gì?
Có thể đáng nói đến là tôi gọi số DB::reconnect()
bên trong lớp công việc của mình vì công nhân xếp hàng đang chạy dưới dạng daemon.
Công việc được gửi đi bằng cách sử dụng DispatchesJobs
đặc điểm như mong đợi. Tôi không can thiệp vào thuật toán xếp hàng theo bất kỳ cách nào khác.
Bất kỳ giải pháp cho việc này? –
Không. Đã chuyển sang beanstalkd ngay bây giờ. Mặc dù tôi thích trình điều khiển DB tốt hơn vì tôi có thể theo dõi công việc và công việc thất bại bằng cách đơn giản nhìn vào bảng DB ... – MaGnetas
Nghiên cứu cách Laravel xử lý các giao dịch của MySQL. Có vẻ như bạn đã bắt đầu một giao dịch, sau đó ngồi trong một thời gian dài. Giao dịch 'COMMIT' ngay khi thực tế. Kiểm tra việc sử dụng 'autocommit'. –