@GlobalTransactional的使用
时间: 2023-07-25 13:35:19 浏览: 93
`@GlobalTransactional` 是 Seata 提供的一个注解,用于开启一个全局事务。在需要使用分布式事务的方法上添加 `@GlobalTransactional` 注解,Seata 会自动开启一个全局事务,并将这个方法的执行过程作为一个分支事务注册到 Seata 中。
以下是 `@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 会将所有分支事务进行一次全局提交或回滚,确保整个分布式事务的一致性。
需要注意的是,`@GlobalTransactional` 注解只能用于 public 方法上,且只能被应用在由 Spring 托管的 bean 上。同时,`@GlobalTransactional` 注解也支持一些参数,可以用于自定义全局事务的超时时间、传播级别等属性。
阅读全文