给我一个分布式事务seata使用的demo
时间: 2023-07-06 12:39:49 浏览: 189
分布式事务解决方案Seata 框架学习代码 Demo
好的,以下是一个使用 Seata 的分布式事务的示例:
1. 创建一个 Spring Boot 项目并添加 Seata 的依赖:
```xml
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>${seata.version}</version>
</dependency>
```
2. 在 Seata 的配置文件中指定注册中心和事务组名称:
```yaml
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_tx_group
registry:
type: nacos
nacos:
server-addr: ${nacos.server-addr}
config:
type: nacos
nacos:
server-addr: ${nacos.server-addr}
group: SEATA_GROUP
namespace: ${nacos.namespace}
```
3. 在需要使用分布式事务的方法上添加 `@GlobalTransactional` 注解:
```java
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private AccountService accountService;
@GlobalTransactional
public void createOrder(Order order) {
// 创建订单
orderMapper.insert(order);
// 扣减账户余额
accountService.reduceBalance(order.getUserId(), order.getTotalAmount());
}
}
@Service
public class AccountService {
@Autowired
private AccountMapper accountMapper;
@GlobalTransactional
public void reduceBalance(Long userId, BigDecimal amount) {
// 扣减账户余额
Account account = accountMapper.selectByUserId(userId);
account.setBalance(account.getBalance().subtract(amount));
accountMapper.updateByPrimaryKeySelective(account);
}
}
```
在上面的示例中,`createOrder` 方法和 `reduceBalance` 方法都添加了 `@GlobalTransactional` 注解,表示它们需要参与到一个全局事务中。
当 `createOrder` 方法被调用时,Seata 会自动开启一个全局事务,并将这个方法的执行过程作为一个分支事务注册到 Seata 中。然后调用 `reduceBalance` 方法时,Seata 会将它也作为一个分支事务注册到 Seata 中。
最后,当 `createOrder` 方法执行完毕时,Seata 会将所有分支事务进行一次全局提交或回滚,确保整个分布式事务的一致性。
希望这个示例对你有所帮助!
阅读全文