Seata原理及简单使用
参考官网:https://seata.apache.org/zh-cn/docs/overview/what-is-seata/
介绍
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
事务模式
AT模式(默认模式)
概述
AT模式是一种补偿型事务模式,通过自动补偿机制实现数据回滚,无业务侵入。在AT模式下,Seata会为用户自动创建一张UNDO_LOG表,用于记录需要回滚的数据。当事务执行失败时,Seata会根据UNDO_LOG表中的记录自动进行反向SQL回滚,保证数据的一致性。
基本使用
@GlobalTransactional
public void purchase(String userId, String commodityCode, int count, int money) {
jdbcTemplateA.update("update stock_tbl set count = count - ? where commodity_code = ?", new Object[] {count, commodityCode});
jdbcTemplateB.update("update account_tbl set money = money - ? where user_id = ?", new Object[] {money, userId});
}
TCC模式
概述
TCC模式是一种补偿型三阶段事务模式,需要业务实现Try、Confirm和Cancel三个操作,有业务侵入,但灵活度高。在Try阶段,业务代码会尝试执行操作,并预留资源。在Confirm阶段,如果Try阶段执行成功,业务代码会确认操作并释放资源。在Cancel阶段,如果Try阶段执行失败,业务代码会取消操作并回滚资源。通过这种方式,TCC模式可以实现分布式事务的最终一致性。
基本使用
区别于在 AT 模式直接使用数据源代理来屏蔽分布式事务细节,业务方需要自行定义 TCC 资源的“准备”、“提交”和“回滚” 。比如在下方的例子中,
public interface TccActionOne {
@TwoPhaseBusinessAction(name = "DubboTccActionOne", commitMethod = "commit", rollbackMethod = "rollback")
public boolean prepare(BusinessActionContext actionContext, @BusinessActionContextParameter(paramName = "a") String a);
public boolean commit(BusinessActionContext actionContext);
public boolean rollback(BusinessActionContext actionContext);
}
Seata 会把一个 TCC 接口当成一个 Resource,也叫 TCC Resource。在业务接口中核心的注解是 @TwoPhaseBusinessAction,表示当前方法使用 TCC 模式管理事务提交,并标明了 Try,Confirm,Cancel 三个阶段。name属性,给当前事务注册了一个全局唯一的的 TCC bean name。同时 TCC 模式的三个执行阶段分别是:
-
Try 阶段,预定操作资源(Prepare) 这一阶段所以执行的方法便是被
@TwoPhaseBusinessAction所修饰的方法。如示例代码中的prepare方法。 -
Confirm 阶段,执行主要业务逻辑(Commit) 这一阶段使用
commitMethod属性所指向的方法,来执行Confirm 的工作。 -
Cancel 阶段,事务回滚(Rollback) 这一阶段使用
rollbackMethod属性所指向的方法,来执行 Cancel 的工作。
其次,可以在 TCC 模式下使用 BusinessActionContext 在事务上下文中传递查询参数。如下属性:
-
xid全局事务id -
branchId分支事务id -
actionName分支资源id,(resource id) -
actionContext业务传递的参数,可以通过@BusinessActionContextParameter来标注需要传递的参数。
在定义好 TCC 接口之后,我们可以像 AT 模式一样,通过 @GlobalTransactional 开启一个分布式事务。
@GlobalTransactional
public String doTransactionCommit(){
tccActionOne.prepare(null,"one");
tccActionTwo.prepare(null,"two");
}
注意,如果 TCC 参与者是本地 bean(非远程RPC服务),本地 TCC bean 还需要在接口定义中添加 @LocalTCC 注解,比如,
@LocalTCC
public interface TccActionTwo {
@TwoPhaseBusinessAction(name = "TccActionTwo", commitMethod = "commit", rollbackMethod = "rollback")
public boolean prepare(BusinessActionContext actionContext, @BusinessActionContextParameter(paramName = "a") String a);
public boolean commit(BusinessActionContext actionContext);
public boolean rollback(BusinessActionContext actionContext);
}
Saga模式
SAGA模式是一种补偿型长事务解决方案,通过状态机编排或者注解方式实现业务逻辑,需要业务实现正向和反向两个操作,有业务侵入。在SAGA模式下,业务代码会被拆分成一系列的小事务,每个小事务都有一个正向操作和一个反向操作。当事务执行失败时,Seata会依次调用每个小事务的反向操作,实现数据的回滚。
XA模式(2PC)
XA模式是一种强一致性的两阶段提交协议,需要数据库支持XA接口,牺牲了一定的可用性,无业务侵入。在XA模式下,事务被分为两个阶段:准备阶段和提交阶段。在准备阶段,参与事务的所有节点都会准备好执行事务操作,但并不真正执行。在提交阶段,如果所有节点都准备好执行事务操作,那么事务协调者会通知所有节点正式执行事务操作并提交;否则,事务协调者会通知所有节点回滚事务操作。

浙公网安备 33010602011771号