Đã có rất nhiều bài viết về chủ đề này:Hibernate có tự động khởi động lại các giao dịch khi deadlocking không?
- Restarting transaction in MySQL after deadlock
- Deadlock found when trying to get lock; try restarting transaction : @RetryTransaction
- MySQL JDBC: Is there an option for automatic retry after InnoDB deadlock?
- Working around MySQL error "Deadlock found when trying to get lock; try restarting transaction"
- ... nhiều hơn nữa
tôi thấy đặc biệt thú vị là câu trả lời cuối cùng được chấp nhận:
Nếu bạn đang sử dụng InnoDB hoặc bất kỳ row-level RDBMS giao dịch, sau đó nó có thể là bất kỳ giao dịch ghi có thể gây ra một bế tắc, ngay cả trong những tình huống hoàn toàn bình thường. Các bảng lớn hơn, các bản ghi lớn hơn và các khối giao dịch dài thường sẽ làm tăng khả năng xảy ra các lần bế tắc xảy ra. Trong tình huống của bạn, nó có thể là một sự kết hợp của những điều này.
Điều đó có nghĩa là chúng tôi không bao giờ có thể ngăn chặn chúng, nhưng chỉ để đối phó với chúng. Điều đó có đúng không? Tôi tự hỏi nếu bạn có thể ngăn chặn deadlocks trên trang web với 1000 người trực tuyến, những người gọi các hoạt động viết DB.
Googling trong chủ đề không nhận được bất kỳ kết quả thú vị nào. Chỉ có một người tôi tìm thấy là (http://www.coderanch.com/t/415119/ORM/databases/Deadlock-problems-Hibernate-Spring-MS):
Mặt khác, tôi nghiêm túc nghi ngờ về chất lượng của giải pháp đó. Bạn có thể vui lòng xây dựng và giải thích những gì sẽ là xử lý tốt nhất của deadlocks? Làm thế nào để đối phó với deadlocks trong các ngân hàng và các ứng dụng doanh nghiệp?
Và bạn nghi ngờ gì với giải pháp như vậy? Đó là AOP bắt ngoại lệ và thử lại trong một số tình huống nhất định.Mặc dù 300 lần thử lại có thể hơi dốc. Spring cũng có một dự án nhỏ, [Spring Retry] (https://github.com/spring-projects/spring-retry) (cũng được Spring Integration và Spring Batch sử dụng cho loại logic này). –
Và nó thực sự là cách tốt nhất để cố gắng khởi động lại các giao dịch? Không thực sự có một cách để ngăn chặn chúng trong cơ sở dữ liệu tải nặng? –
Và những gì là sai với một thử lại. Bạn có thể thử và ngăn chặn chúng bằng cách cô lập cơ sở dữ liệu nhưng theo cách đó ứng dụng của bạn sẽ thu thập dữ liệu ... –