Giao dịch phân tán
Dependency govex-cloud-transaction giải quyết bài toán distributed transaction: một chuỗi thao tác trải trên nhiều database/kho dữ liệu trong cùng một nghiệp vụ. Cơ chế hoạt động: gắn XID nghiệp vụ cho toàn bộ chuỗi thao tác (qua annotation @XidTransactional) và ghi undo log (ChangeData) trong lúc thực thi, để có thể hoàn tác/bù trừ theo từng loại database khi một bước thất bại. XID ở đây là cơ chế định danh chuỗi giao dịch, không phải mục đích sử dụng.
Khi nào sử dụng
- Method cần chạy trong một transaction vật lý gắn với XID nghiệp vụ (mã đơn, mã hồ sơ...) để tra cứu/đối soát.
- Cần undo log để hoàn tác các thay đổi dữ liệu của một giao dịch đã commit (ví dụ khi bước sau thất bại).
- Cần lưu vết thay đổi (ảnh trước/sau) cho mục đích audit hoặc khôi phục dữ liệu.
- Cần cơ chế rollback bù trừ theo từng database khi không thể dùng distributed transaction.
Cài đặt
<dependency>
<groupId>vn.govex.cloud</groupId>
<artifactId>govex-cloud-transaction</artifactId>
</dependency>
Version do BOM quản lý — xem Cài đặt.
Cấu hình
| Property | Mô tả | Mặc định |
|---|---|---|
govex.transaction.enabled | Bật/tắt hỗ trợ giao dịch phân tán. | true |
govex.transaction.undo.enabled | Bật undo log; khi bật mới đăng ký UndoLogManager và listener ghi log. | false |
govex.transaction.undo.table-name | Tên bảng lưu undo log. | undo_log |
govex.transaction.undo.data-validation-enable | Kiểm tra hợp lệ dữ liệu trước khi undo. | true |
govex.transaction.undo.delete-log-after-undo | Xoá bản ghi undo log sau khi undo thành công. | true |
govex.transaction.undo.serializer | Tên serializer encode/decode undo log. | jackson |
govex.transaction.undo.compress.enabled | Bật nén dữ liệu undo log trước khi lưu. | true |
govex.transaction.undo.compress.threshold | Ngưỡng kích thước bắt đầu nén. | 64k |
govex.transaction.undo.columns.* | Tên cột trong bảng undo log (id, transaction-id, application, context, data, action-time, action-user). | tên cột chuẩn |
Sử dụng
Bước 1 — khai báo cấu hình; tên ứng dụng ghi vào log lấy từ spring.application.name:
spring:
application:
name: order-service
govex:
transaction:
enabled: true
undo:
enabled: true
table-name: undo_log
delete-log-after-undo: true
compress:
enabled: true
type: none
Bước 2 — tạo bảng undo log trong database, tối thiểu gồm các cột theo cấu hình mặc định: id, transaction_id, application, context, data, action_time, action_user (dependency không tự tạo bảng, xem Lưu ý).
Bước 3 — đánh dấu method cần giao dịch; xid là biểu thức SpEL, có thể tham chiếu tham số method:
@XidTransactional(xid = "#command.orderId")
public void placeOrder(PlaceOrderCommand command) {
orderRepository.save(new Order(command.orderId()));
stockService.decrease(command.orderId());
}
Bước 4 — khi cần hoàn tác (ví dụ từ job xử lý lỗi hoặc console quản trị):
undoLogManager.undo("order-123");
Lưu ý
- Điều kiện tiên quyết: cần
govex-cloud-datasource(proxy connection thu thậpChangeData) vàPlatformTransactionManager/TransactionTemplatecủa ứng dụng; thêm dependency datasource nếu chưa có. govex.transaction.undo.enabledmặc định làfalse; phải đặttruemới có undo log.- Bảng
undo_logchưa được tạo tự động (changeset của dependency hiện rỗng) — cần tạo bằng migration/DDL của ứng dụng trước khi dùng. - Undo log chỉ ghi khi thao tác đi qua datasource proxy của
govex-cloud-datasource;ChangeDatađược listener xử lý trước khi transaction commit. - Dependency có sẵn undo executor cho MySQL, MariaDB, Oracle và PostgreSQL.
@XidTransactionalchỉ áp dụng trên method và chỉ có hiệu lực khi gọi qua proxy Spring; biểu thứcxidđược dịch tại runtime nên cần đúng cú pháp SpEL.