
一个seata服务端,三个seata客户端
7. 模拟分布式事务问题
- 订单服务先不开启全局事务,注释掉@GlobalTransactional
/**
* 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
* 简单说:下订单->扣库存->减余额->改状态
*/
@Override
//@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
public void create(Order order)
{
log.info("----->开始新建订单");
//1 新建订单
orderDao.create(order);
//2 扣减库存
log.info("----->订单微服务开始调用库存,做扣减Count");
storageService.decrease(order.getProductId(),order.getCount());
log.info("----->订单微服务开始调用库存,做扣减end");
//3 扣减账户
log.info("----->订单微服务开始调用账户,做扣减Money");
accountService.decrease(order.getUserId(),order.getMoney());
log.info("----->订单微服务开始调用账户,做扣减end");
//4 修改订单状态,从零到1,1代表已经完成
log.info("----->修改订单状态开始");
orderDao.update(order.getUserId(),0);
log.info("----->修改订单状态结束");
log.info("----->下订单结束了,O(∩_∩)O哈哈~");
}
- 账户服务模拟超时异常
/**
* 扣减账户余额
*/
@Override
public void decrease(Long userId, BigDecimal money) {
LOGGER.info("------->account-service中扣减账户余额开始");
//模拟超时异常,全局事务回滚
//暂停几秒钟线程
try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
accountDao.decrease(userId,money);
LOGGER.info("------->account-service中扣减账户余额结束");
}
- Postman测试
由于账户服务超时,postman连接异常
url参数的意思是1号用户购买了10个1号类型的产品,花了100元
order表
| id | user_id | product_id | count | money | status |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 10 | 100 | 0 |
account表 (由于feign的重试机制,可能第一次查看和第二次查看的结果会有所不同)
| id | user_id | total | used | residue |
|---|---|---|---|---|
| 1 | 1 | 1000 | 100 | 900 |
storage表
| id | product_id | total | used | residue |
|---|---|---|---|---|
| 1 | 1 | 100 | 10 | 90 |
8. Navicat手动还原数据,验证分布式事务
- 订单服务开启全局事务注解@GlobalTransactional
/**
* 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
* 简单说:下订单->扣库存->减余额->改状态
*/
@Override
@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
public void create(Order order)
- Postman测试
还是由于账户服务超时,postman连接异常
开启全局事务注解时postman调试
order表
| id | user_id | product_id | count | money | status |
|---|---|---|---|---|---|
| (N/A) | (N/A) | (N/A) | (N/A) | (N/A) | (N/A) |
account表
| id | user_id | total | used | residue |
|---|---|---|---|---|
| 1 | 1 | 1000 | 0 | 1000 |
storage表
| id | product_id | total | used | residue |
|---|---|---|---|---|
| 1 | 1 | 100 | 0 | 100 |

评论列表