# 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
主体流程:创建订单,分别调用账户服务减余额,调用库存服务减库存
项目结构:

目标:创建订单成功后,调用账户服务和库存服务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

淘宝店:提供一元解决Java问题和其他方面的解决方案,欢迎咨询
