首页 > 编程知识 正文

seata集群,分布式事务协调器

时间:2023-05-06 11:42:24 阅读:145218 作者:2223

本文介绍了使用阿里巴巴分布式事务框架seATa的基于springcloud feign的TCC模型(1.4.0版)。 正如上一篇文章所述,at模型几乎可以满足使用分布式事务的80%的需求。 但是,如果需要手动控制非关系数据库(如redis )和中间件操作、公司间服务调用语言之间的APP应用程序调用或整个两步提交过程,则必须结合使用TCC模式。 有关seata的介绍,请单击此处访问seata官方网站。

另一方面,TCC模式的概念是分布式全局事务,总体为两阶段提交(Try-[Comfirm/Cancel])的模型。 在SEATA中,AT和TCC模式实际上基于两级提交实现。 他们的区别如下

AT模式为支持本地 ACID 事务关系型数据库:

阶段预准备行为:本地事务将业务数据更新和相应的回退记录一起提交。 两阶段commit行为:立即正常退出,自动异步批量清理回滚日志。 两阶段回滚操作:通过回滚日志,生成自动补偿操作,完成数据回滚。 因此,TCC模型不依赖于底层数据资源的事务支持。

一级prepare行为:调用自定义的prepare逻辑。 两阶段commit行为:调用自定义的commit逻辑。 两阶段回滚行为:调用自定义上的回滚逻辑。 TCC模式支持将自定义上的分支事务合并到全局事务的管理中。

简单地说,SEATA的TCC模式为手工的AT模式,允许您定制两级处理逻辑,而不依赖于AT模式的还原_日志。

二、前提准备nacosseata服务端(TC )三、TM和TCC-RM的构建)源代码点这里)本章重点是实现基于SpringCloud Feign的TCC,项目的构建直接看源代码

3.1 seata服务端的搭建

3.2 TM的搭建

3.3 TCC-RM的搭建

3.3.1 定义TCC接口

由于使用的是SpringCloud Feign,并且对Feign的调用基于http,因此在此处使用本地TCC。 值得注意的是,@LocalTCC一定要在界面上留言,这个界面可以是普通的业务界面,只要实现了TCC的两阶段提交应对方法即可。

适用于3358 www.Sina.com/springcloudfeign模式的tcc @LocalTCC注释try方法。 这里,name用当前TCC方法的bean名写方法名即可。 如果指定了commitmethher 3三个方法,seata将根据全局事务的成功或失败自动调用提交方法或回滚方法。@TwoPhaseBusinessAction注释可以将参数传递到两级(commitMethod/rollbackMethod )方法。@BusinessActionContextParameter是指TCC事务上下文/** *在此定义TCC的接口*始终使用在接口上定义的springCloud的远程调用*,其中loccoud @ localtccpublicinterfacetccservice {/* * *定义两阶段提交* name=该TCC的bean名称,全局唯一* commitMethod=commit是两阶段确认方法* roll back businessactioncontextparameter注释分两个阶段传递参数* * @ param params-in @ return string */@ twophasebusinessaction (name=' ) 回滚方法=' cancel ' ) string insert (@ businessactioncontextparameter (param name=' params ' ) MapString,string parameter

ommitMethod一致 * context可以传递try方法的参数 * * @param context 上下文 * @return boolean */ boolean commitTcc(BusinessActionContext context); /** * 二阶段取消方法 * * @param context 上下文 * @return boolean */ boolean cancel(BusinessActionContext context);}

3.3.2 TCC接口的业务实现

为了保证代码的简洁,此处将Controller与Service结合讲解,实际项目则不然。

在try方法中使用@Transational可以直接通过spring事务回滚关系型数据库中的操作,而非关系型数据库等中间件的回滚操作可以交给rollbackMethod方法处理。使用context.getActionContext("params")便可以得到一阶段try中定义的参数,在二阶段对此参数进行业务回滚操作。注意1:此处亦不可以捕获异常(同理切面处理异常),否则TCC将识别该操作为成功,二阶段直接执行commitMethod。注意2:TCC模式要开发者自行保证幂等和事务防悬挂 @Slf4j@RestControllerpublic class TccServiceImpl implements TccService { @Autowired TccDAO tccDAO; /** * tcc服务t(try)方法 * 根据实际业务场景选择实际业务执行逻辑或者资源预留逻辑 * * @param params - name * @return String */ @Override @PostMapping("/tcc-insert") @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public String insert(@RequestBody Map<String, String> params) { log.info("xid = " + RootContext.getXID()); //todo 实际的操作,或操作MQ、redis等 tccDAO.insert(params); //放开以下注解抛出异常 //throw new RuntimeException("服务tcc测试回滚"); return "success"; } /** * tcc服务 confirm方法 * 若一阶段采用资源预留,在二阶段确认时要提交预留的资源 * * @param context 上下文 * @return boolean */ @Override public boolean commitTcc(BusinessActionContext context) { log.info("xid = " + context.getXid() + "提交成功"); //todo 若一阶段资源预留,这里则要提交资源 return true; } /** * tcc 服务 cancel方法 * * @param context 上下文 * @return boolean */ @Override public boolean cancel(BusinessActionContext context) { //todo 这里写中间件、非关系型数据库的回滚操作 System.out.println("please manually rollback this data:" + context.getActionContext("params")); return true; }}

至此完成seata-tcc模式的配置工作。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。