2014-10-17 13 views
7

Đã 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?

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?

+1

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). –

+0

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? –

+1

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 ... –

Trả lời

4

Phiên Hibernate đòi hỏi một bộ nhớ cache cấp 1 đầu tiên. Điều này cho phép bạn thực hiện các thay đổi sau lên đến thời điểm chịu trách nhiệm cuối cùng, do đó giảm khoảng thời gian chuyển đổi khóa (xảy ra ngay cả trong READ_COMMITTED isolation level).

Điều đó có nghĩa là bạn phải giảm thiểu tất cả thời gian giao dịch và tôi có thể khuyên bạn sử dụng FlexyPool cho nỗ lực đó. Bạn cần đảm bảo tất cả giao dịch càng ngắn càng tốt, để giảm khoảng thời gian khóa để cải thiện khả năng mở rộng.

Khóa giới thiệu hoạt động nối tiếp và theo Amdahl's law, khả năng mở rộng tỷ lệ nghịch với tổng số hoạt động nối tiếp.

Lời khuyên của tôi trước tiên là làm việc để giảm khoảng thời gian giao dịch. Lập chỉ mục sẽ giảm thời gian truy vấn. ORM có thể tạo ra các truy vấn khủng khiếp để đảm bảo integration testsverify expected queries against actual executed ones của bạn.

Công cụ như p6spy rất tiện lợi cho việc định thời gian truy vấn của bạn để đảm bảo bạn cũng sử dụng nó.

Khi tất cả giao dịch càng ngắn càng tốt và bạn vẫn cần đồng thời nhiều hơn, bạn có thể chuyển sang khả năng mở rộng theo chiều ngang. Trước tiên, bạn có thể bắt đầu với một chiến lược sao chép tổng thể-nô lệ đồng bộ và chuyển hướng lần đọc đến nô lệ nút trong khi vẫn giữ nguyên cho các giao dịch ghi.

Các vấn đề liên quan