Tôi có một ứng dụng - giống như một tiện ích - nằm trong một góc và cập nhật hai cơ sở dữ liệu khác nhau theo định kỳ.Cách tốt nhất để thực hiện các giao dịch phân tán trên nhiều cơ sở dữ liệu bằng cách sử dụng Spring và Hibernate
Đây là một ứng dụng độc lập nhỏ đã được xây dựng bằng Ngữ cảnh ứng dụng mùa xuân. Ngữ cảnh có hai Nhà máy phiên Hibernate được cấu hình trong nó, lần lượt sử dụng các nguồn dữ liệu của Commons DBCP được cấu hình trong Spring.
Hiện tại không có quản lý giao dịch, nhưng tôi muốn thêm một số. Bản cập nhật cho một cơ sở dữ liệu phụ thuộc vào bản cập nhật thành công cho một cơ sở dữ liệu khác.
Ứng dụng không nằm trong vùng chứa Java EE - nó được khởi động bởi lớp khởi động tĩnh được gọi từ tập lệnh shell. Lớp khởi động khởi tạo ngữ cảnh ứng dụng và sau đó gọi một phương thức trên một trong các bean của nó.
Cách 'tốt nhất' để đặt giao dịch xung quanh cập nhật cơ sở dữ liệu là gì?
Tôi sẽ để lại định nghĩa 'tốt nhất' cho bạn, nhưng tôi nghĩ rằng cần có một số chức năng 'dễ thiết lập', 'dễ định cấu hình', 'rẻ tiền' và 'dễ dàng đóng gói và phân phối lại' . Tự nhiên FOSS sẽ là tốt.
Giao dịch được phân phối phải phản ánh tất cả 4 thuộc tính ACID. Vấn đề của bạn là gì? Kịch bản bạn mô tả không thể xảy ra, vì các nhà quản lý đang giao tiếp với nhau và chỉ cam kết khi tất cả các nút tham gia đã trao đổi "GO". – Falcon
@Falcon: Vậy điều gì sẽ xảy ra nếu mạng bị lỗi giữa PREPARE và COMMIT? Hoặc một trong những máy chủ chết? "không thể xảy ra" không thể xảy ra trong thực tế. –
Không, họ không được hướng dẫn quay lại vì trong trường hợp này, một số nút đã cam kết. Điều gì xảy ra là khi nút bị rơi trở nên có sẵn, điều phối viên giao dịch yêu cầu nó thực hiện lại. Bởi vì nút phản hồi tích cực trong giai đoạn "chuẩn bị", cần phải có khả năng "cam kết", ngay cả khi nó trở lại sau sự cố. –