# seata-demo **Repository Path**: coderman_hero/seata-demo-me ## Basic Information - **Project Name**: seata-demo - **Description**: 集成seata分布式事务框架示例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-11-10 - **Last Updated**: 2023-11-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 参考文章: https://blog.csdn.net/weixin_39544175/article/details/128280173?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-128280173-blog-130889752.235^v38^pc_relevant_default_base&spm=1001.2101.3001.4242.2&utm_relevant_index=4 [分布式事务——dubbo集成seata示例](https://blog.csdn.net/weixin_39544175/article/details/128280173?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-128280173-blog-130889752.235^v38^pc_relevant_default_base&spm=1001.2101.3001.4242.2&utm_relevant_index=4) ## TCC模式示例 技术组件:springboot、dubbo、zookeeper、nacos、seata 主体流程:创建订单,分别调用账户服务减余额,调用库存服务减库存 项目结构: ![](./doc/项目结构.png) 目标:创建订单成功后,调用账户服务和库存服务commit(),过程中有异常则调用服务rollback(). ### 1. 接口定义 ```java /** * 数字藏品账户服务 * @author Tarzan写bug * @date 2022/12/08 */ @LocalTCC public interface DigitalAccountService { /** * 扣钱 * @param id * @param money * @return */ @TwoPhaseBusinessAction(name = "digitalAccountService", commitMethod = "commitDeductMoney", rollbackMethod = "rollbackDeductMoney") AccountDTO deductMoney(BusinessActionContext businessActionContext, Long id, BigDecimal money); AccountDTO commitDeductMoney(BusinessActionContext businessActionContext); AccountDTO rollbackDeductMoney(BusinessActionContext businessActionContext); } ``` ```java /** * 数字藏品库存 * @author Tarzan写bug * @date 2022/12/08 */ @LocalTCC public interface DigitalInstockService { /** * 减库存 * @param instockNum */ @TwoPhaseBusinessAction(name = "digitalInstockService", commitMethod = "commitDeductInstock", rollbackMethod = "rollbackDeductInstock") void deductInstock(long instockNum); void commitDeductInstock(BusinessActionContext businessActionContext); void rollbackDeductInstock(BusinessActionContext businessActionContext); } ``` ```java /** * 数字藏品订单 * @author Tarzan写bug * @date 2022/12/08 */ public interface DigitalOrderService { /** * 创建订单 * @param id */ void createOrder(Long id); } ``` 在定义分支事务的时候,在接口类上标注`@LocalTCC`,定义3个方法`prepare()`、`commit()`、`rollback()`,在`prepare()`上标注`@TwoPhaseBusinessAction`,注解中的属性值`name`为bean的名称,`commitMethod`为提交方法的名称,`rollbackMethod`为回滚方法的名称。 ### 2. 提供者端 添加seata的`maven`依赖 ```xml io.seata seata-spring-boot-starter com.alibaba.nacos nacos-client ``` `application.yml`中添加seata client配置 ```yml seata: enabled: true # 应用名称 application-id: digital-instock-provider # 事务组,要和服务端配置保持一致 tx-service-group: default_tx_group client: rm-report-success-enable: true rm-table-meta-check-enable: false rm-report-retry-count: 5 rm-async-commit-buffer-limit: 10000 rm: lock: retry-interval: 10 retry-times: 30 retry-policy-branch-rollback-on-conflict: true tm: commit-retry-count: 3 rollback-retry-count: 3 undo: data-validation: true log-serialization: jackson log-table: undo_log service: # 跟服务端配置保持一致 vgroup-mapping: default_tx_group: default enable-degrade: false disable-global-transaction: false grouplist: default: 127.0.0.1:8091 transport: shutdown: wait: 3 thread-factory: boss-thread-prefix: NettyBoss worker-thread-prefix: NettyServerNIOWorker server-executor-thread-prefix: NettyServerBizHandler share-boss-worker: false client-selector-thread-prefix: NettyClientSelector client-selector-thread-size: 1 client-worker-thread-prefix: NettyClientWorkerThread type: tcp server: nio heartbeat: true serialization: seata compressor: none enable-client-batch-send-request: true registry: type: nacos nacos: server-addr: localhost:8848 namespace: 405e877e-56ab-4755-8dd8-6541e1ee4845 group: SEATA_GROUP username: nacos password: nacos config: type: nacos nacos: server-addr: localhost:8848 namespace: 405e877e-56ab-4755-8dd8-6541e1ee4845 group: SEATA_GROUP username: nacos password: nacos # 貌似没什么用 data-id: SEATA_CLIENT.properties ``` 配置中主要关注`seata.tx-service-group`和`seata.service.vgroup-mapping`属性要跟服务端配置的保持一致,不然会报如下错误: ``` can not get cluster name in registry config 'service.vgroupMapping.oauth-seata-service-group', please make sure registry config correct ``` 在事务发起者方法上添加`@GlobalTransactional`注解 ```java @GlobalTransactional @Override public void createOrder(Long id) { LOGGER.info(this.getClass() + " createOrder()"); accountService.deductMoney(null, id, new BigDecimal(100)); instockService.deductInstock(2L); } ``` ### 消费者端 dubbo消费者端不涉及seata. 作者公众号:Tarzan写bug ![](./doc/公众号二维码.jpg) 淘宝店:提供一元解决Java问题和其他方面的解决方案,欢迎咨询 ![](./doc/淘宝店铺.png)