开源软件
云服务
云服务器ECS
助您降低 IT 成本,提升运维效率
云数据库MySql
全球最受欢迎的开源数据库之一
对象存储
稳定、安全、高效、易用的云存储服务
API网关
助您降低 IT 成本,提升运维效率
云数据库Redis
轻松构建/部署和管理Api
云交付
开发者
应用市场
应用软件
企业记账,协同办公等服务软件
接口服务
灵活高效,轻松上手
开放实验室
敲敲网
帮助中心
控制台
登录
|
注册
当前位置:
极客社区OPENDAO
代码仓库
seata-service-demo
/
seata-service-demo
分布式事务seata的入门使用demo
代码
5780b14e
seata-service-demo
/
README.md
克隆/下载
分支(1)
标签
提交
master
5780b14e
HTTPS
SSH
复制
README.md
历史
> ## 概述 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 从demo中了解Seata框架所能达到的效果,将会介绍 seata 的一个入门使用 demo ,作为使用 seata 的入门学习案例。 本案例演示了AT、TCC两种模式。 > ## 准备工作 ### 配置中心 根据seata服务的配置类型,选择配置中心。我选择使用Nacos作为配置中心 ### Seata服务端安装 Seata官网:
从官网下载Seata,配置Server服务 * conf/application.yml * config/registry.conf * seataServer.properties * > ## Seata客户端配置 客户端的jar包要和服务端的版本保持一致 pom.xml中增加sdk开发包 ```
com.alibaba.cloud
spring-cloud-starter-alibaba-seata
2.2.5.RELEASE
``` 在要参与事务的库中,增加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); ```