事务注解
@USTxTry
在微服务的@USEntry接口上添加@USTxTry注解,可以开启此接口的事务处理:
@USTxTry(
propagation = Transaction.PROPAGATION_USE,
submit = Transaction.SUBMIT_ORIGIN,
compensation = @USTxCompensation(
confirm = Transaction.COMPENSATION_REDO,
cancel = Transaction.COMPENSATION_SUBMIT
)
)
@USEntry(
tips = "事务测试",
timeout = 10
)
public void test(ServiceContext ctx) {
//todo
}
- propagation,事务的开启/传播方式
取值 | 说明 |
---|---|
PROPAGATION_PASS | 如果在全局事务中,则只向后传递事务,自身不参与全局事务; 如果不在事务中,也不开启新事务 |
PROPAGATION_META | 如果存在全局事务,则加入;否则仅开启本地事务(无后续分支事务,不需要事务管理器) |
PROPAGATION_USE | 如果存在全局事务,则加入;否则开启新的全局事务 |
PROPAGATION_NEW | 不管是否存在全局事务,都开启新的全局事务 |
- submit,事务的提交方式
取值 | 说明 |
---|---|
SUBMIT_NONE | 不需要提交(本接口不包含本地事务) |
SUBMIT_ORIGIN | "原地"提交:在Confirm/Cancel阶段可以使用Try阶段的服务对象进行commit/rollback操作(适用于采用传统XA方式的事务实现) |
SUBMIT_ANY | "任意"提交:提交动作可以由任意一个服务实例执行(适用于采用"数据补偿"方式的事务实现) |
compensation,事务提交失败时的补偿方式
提交动作(包括commit/rollback)是由事务管理器发起的,一个全局事务会包含若干分支事务,每个分支事务实际对应一个微服务的业务接口,当全局事务需要submit时,事务管理器会依次向各个分支事务的服务接口发起"提交"请求,这些请求有可能会失败,compensation约定了submit动作失败后,事务管理器如何进行重试的策略。
补偿模式的取值说明如下:
取值 | 说明 |
---|---|
COMPENSATION_NONE | 不能补偿 |
COMPENSATION_SUBMIT | 仅补偿提交动作 |
COMPENSATION_REDO | 可以重新发起事务(事务接口必须是幂等的,且仅对CONFIRM有效) |
如果声明了补偿方式,对于"提交"失败的分支事务,事务管理器会在第1/5/30分钟分别进行3次"重试",直到分支事务"提交"成功或最终失败。
@USTxConfirm / @USTxCancel
针对@USTxTry声明的事务接口,@USTxConfirm和@USTxCancel分别用来声明该接口的"提交"动作(commit/rollback)的处理方法(服务类的成员函数),注解的定义如下:
@USTxConfirm(entry="test") // 对应的接口,可以用"*"表示通配符
public void commit(ServiceContext ctx) {
//todo
}
@USTxCancel(entry="test") // 对应的接口,可以用"*"表示通配符
public void rollback(ServiceContext ctx) {
//todo
}