废话不多说,直接贴代码
1.AT
1.application启动类上添加: @EnableAutoDataSourceProxy
2.需要事务的方法或类上添加:
@GlobalTransactional(rollbackFor = Exception.class)
3.启动服务
控制台输出:
2.TCC
AT模式基本上能满足我们使用分布式事务大部分需求,但涉及非关系型数据库与中间件的操作、跨公司服务的调用、跨语言的应用调用就需要结合TCC模式;
一个分布式的全局事务,整体式两阶段提交(Try-[Comfirm/Cancel])的模型,在seata中,AT模式与TCC模式事实上都是基于两阶段提交实现的,它们的区别在于:
AT模式基于支持本地ACID事务的关系型数据库:
1.一阶段prepare行为:在本地事务中,一并提交“业务数据更新”和“相应回滚日志记录”;
2.二阶段commit行为:马上成功结束,自动异步批量清理回滚日志;
3.二阶段rollback行为:通过回滚日志,自动生成补偿操作,完成数据回滚;
相应的,TCC模式需要我们认为编写代码实现提交和回滚:
1.一键端prepare行为:调用自定义的prepare逻辑(如插入、删除、修改等操作);
2.二阶段commit行为:调用自定义的commit逻辑;
3.二阶段rollback行为:调用自定义的rollback逻辑;
所以TCC模式就是把自定义的分支事务(提交和回滚)纳入到全局事务管理中:
seata中的TCC模式就是手动版的AT模式,它允许自定义两阶段的处理逻辑而不需要依赖AT模式的undo_log回滚表;
示例:
需要事务的方法或类上(事务发起方TM)添加@GlobalTransactional注解
在接口上添加@LocalTCC注解 注:该注解添加在接口上,而不是实现类上
方法上添加@TwoPhaseBusinessAction 定义两阶段提交
该注解属性
name:定义一个全局唯一值,一般为该方法名
commitMethod:自定义提交方法名(二阶段提交),需和下方提交方法名保持一致
rollbackMethod:自定义回滚方法名(二阶段回滚),需和下方回滚方法名保持一致
@BusinessActionContextParameter 加上该注解可传递参数到二阶段方法
BusinessActionContext 上下文 可取到@BusinessActionContextParameter定义的参数
实现类中commit方法可以为空确认
在rollback方法中写自定义回滚操作,该方法里可以实现中间件、非关系型数据库的回滚操作
剩下的两种模式(SAGA、XA)本人只是稍微了解了一下,实际应用当中没有用到