开源软件
云服务
云服务器ECS
助您降低 IT 成本,提升运维效率
云数据库MySql
全球最受欢迎的开源数据库之一
对象存储
稳定、安全、高效、易用的云存储服务
API网关
助您降低 IT 成本,提升运维效率
云数据库Redis
轻松构建/部署和管理Api
云交付
开发者
应用市场
应用软件
企业记账,协同办公等服务软件
接口服务
灵活高效,轻松上手
开放实验室
敲敲网
帮助中心
控制台
登录
|
注册
当前位置:
极客社区OPENDAO
代码仓库
seata-service-demo
/
seata-service-demo
分布式事务seata的入门使用demo
代码
master
seata-service-demo
/
README.md
克隆/下载
分支(1)
标签
master
HTTPS
SSH
复制
README.md
历史
> ## 概述 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 从demo中了解Seata框架所能达到的效果,将会介绍 seata 的一个入门使用 demo ,作为使用 seata 的入门学习案例。 本案例演示了AT、TCC两种模式。 > ## 准备工作 ### 配置中心 根据seata服务的配置类型,选择配置中心。我选择使用Nacos作为配置中心 ### Seata服务端安装 Seata官网:
从官网下载Seata,我这里下载的是seata1.5.2版本 配置Server服务 * conf/application.yml * config/registry.conf * seataServer.properties * > ## Seata客户端配置 客户端的jar包要和服务端的版本保持一致 pom.xml中增加sdk开发包 ```
io.seata
seata-spring-boot-starter
1.5.2
com.alibaba.cloud
spring-cloud-starter-alibaba-seata
2.2.8.RELEASE
io.seata
seata-spring-boot-starter
``` > ## AT模式 在要参与事务的库中,增加undo_log数据表, ``` CREATE TABLE undo_log ( id bigint(20) NOT NULL AUTO_INCREMENT, branch_id bigint(20) NOT NULL COMMENT 'branch transaction id', xid varchar(128) NOT NULL COMMENT 'global transaction id', context varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization', rollback_info longblob NOT NULL COMMENT 'rollback info', log_status int(11) NOT NULL COMMENT '0:normal status,1:defense status', log_created datetime NOT NULL COMMENT 'create datetime', log_modified datetime NOT NULL COMMENT 'modify datetime', ext varchar(100) DEFAULT NULL COMMENT 'reserved field', PRIMARY KEY (id) USING BTREE, UNIQUE KEY ux_undo_log (xid,branch_id) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='AT transaction mode undo table' ``` 在需要管理的事务方法上增加注解 ``` @GlobalTransactional(rollbackFor = Exception.class) @GlobalLock ``` 手动回滚 ``` String xid = RootContext.getXID(); TransactionManager manager = TransactionManagerHolder.get(); try { // todo if(符合回滚条件){ log.info("test 开始回滚数据"); GlobalStatus status = manager.rollback(xid); } } catch (Exception e) { e.printStackTrace(); try { manager.rollback(xid); } catch (TransactionException transactionException) { transactionException.printStackTrace(); } } ``` 临时挂起 在一个大的分布式事务中,如果分布式事物的某个环节出现了异常,通过try{}catch(){}后,需要记录一个日志到数据库中,此处可能需要挂起这个分布式事务,让记录日志的方法不参与到分布式事务中 ``` String xid = RootContext.getXID(); //todo // 解除 xid 的绑定 RootContext.unbind(); // =============== 此方法不在分布式事务中================= logService.insert("xxxxxx") // =============== 此方法不在分布式事务中================= // 重新绑定 xid RootContext.bind(xid); // 2、下订单 orderService.createOrder(accountId, amount); ``` > ## TCC模式 TCC模式服务接口定义,接口中包括三个方法,prepare、commit和rollback,自定义方法名称和参数,在prepare方法上增加@TwoPhaseBusinessAction注解,在接口上增加@LocalTCC注解 ``` @LocalTCC public interface TccTestService { @TwoPhaseBusinessAction(name = "TccTestService", commitMethod = "commitAction", rollbackMethod = "rollbackAction") ReturnData prepareAction(BusinessActionContext businessActionContext, @BusinessActionContextParameter(paramName = "guid") Long id, @BusinessActionContextParameter(paramName = "moduleType") Long type) ; boolean commitAction(BusinessActionContext businessActionContext); boolean rollbackAction(BusinessActionContext businessActionContext); } ``` 服务接口的实现 ``` @Component public class TccTestServiceImpl implements TccTestService { } ``` Tcc接口服务的调用,在要调用的服务上引用 ``` @Autowired private TccTestService tccTestService; @Override @GlobalTransactional(rollbackFor = Exception.class) public ReturnData testTCC(Long id, Long type) { ReturnData returnDate = new ReturnData(); String xid = RootContext.getXID(); TransactionManager manager = TransactionManagerHolder.get(); try { returnDate = tccTestService.prepareAction(null, id, type); if(!returnDate.isSuccess()){ GlobalStatus status = manager.rollback(xid); } } catch (Exception e) { e.printStackTrace(); try { manager.rollback(xid); } catch (TransactionException transactionException) { transactionException.printStackTrace(); } returnDate.setError("9991", e.getLocalizedMessage()); } return returnDate; } ```