Ngữ cảnh là Java - JPA với Hibernate và Spring.Chỉ giao dịch chặn khi chắc chắn được cam kết nhưng trước khi cam kết
Hãy lấy kịch bản xác nhận hai pha (nhưng chỉ với một tài nguyên):
Query cam kết từ ứng dụng
Vote Có/Không (từ cơ sở dữ liệu trong trường hợp của chúng tôi)
3.1. Nếu có từ cơ sở dữ liệu
3.1.1. (Gọi lại mã theo số) - không phải là một phần của giao thức
3.1.2. Cam kết cơ sở dữ liệu
3.2 Nếu không
3.2.1 Rollback để cơ sở dữ liệu
Những gì tôi muốn là một cách để làm điều gọi lại từ 3.1.1 trong mã, nhưng chỉ khi nó được biết rằng giao dịch sẽ được cam kết, nhưng trước đây thực sự là cam kết. Ngoài ra, nếu một ngoại lệ được ném vào đây, thì giao dịch sẽ được khôi phục.
Sử dụng TransactionSynchronization
(*) từ mùa xuân, cho phép bạn chặn giao dịch trước khi giao dịch được thực hiện/hoàn tất hoặc sau khi giao dịch được thực hiện/hoàn tất.
beforeCommit()
gọi lại cho biết rằng một cuộn lại vẫn có thể xảy ra sau khi phương pháp được gọi;beforeComplete()
được gọi ngay cả khi giao dịch bị lỗiafterCommit/Complete()
được gọi sau khi giao dịch thực sự được cam kết với cơ sở dữ liệu và không có cách nào để khôi phục.
Bây giờ tôi có vẻ như những gì tôi muốn là một giao thức cam kết hoàn toàn hai giai đoạn khác; nhưng tôi tự hỏi nếu có một cách giải quyết trong mùa xuân. Sự khác biệt là cuộc gọi được thực hiện trong cuộc gọi lại không thể được khôi phục.
(*) từ mùa xuân 4.2 là rất đơn giản với @TransactionalEventListener
và TransactionPhase
mà độc đáo tóm tắt TransactionSynchronization
Bạn đang cố gắng bắt chước cam kết hai giai đoạn? Bạn đã thử ' '? Nó cung cấp cam kết twophase vào mùa xuân. –
Zeus
@Zeus Có, nhưng không đầy đủ; cuộc gọi được thực hiện trong phương thức gọi lại không nên và không thể được cuộn lại. Sẽ xem xét JtaTransactionManager. Không cần phải nói rằng gọi lại chỉ là một cuộc gọi lại mã, không phải là một nguồn lực đầy đủ hàm ý XA. – m3th0dman
Bạn đã xem xét sử dụng Spring PlatformTransactionManager chưa? Kiểm tra tài liệu Spring, đây là giao diện bạn có thể triển khai và truyền. –