Seata AT

143 阅读1分钟

Seata AT

简略流程

image.png

死锁问题

  1. ServerA和ServerB都需要Update id = 0001这条数据

image.png

  • 分布式事务1,ServerA获取了全局锁,等待id=0001的本地锁。
  • 分布式事务2,ServerB获取了id=0001的本地锁,等待全局锁。
  • Seata At超时机制解决了死锁问题,优先释放分布式事务2本地锁,让分布式事务1全局锁去执行回滚操作

读隔离

数据库本地事务隔离级别默认是已提交,Sata AT默认隔离级别是读未提交。

并发能力分析

当不同人购买同一件商品时会产生扣减库存吞吐量低,其他分布式事务会等待分布式锁释放。多个分布式事务竞争、等待同一条库存数据。

解决方案

  1. 对于一个含有n条库存数据的商品,总库存为1万件。我们将这1万件库存分成了1000条库存数据,每条库存数据可以扣减10件。按照预先设定的规则,每次扣减操作将根据规则选择其中一条库存数据,并从该库存数据中扣减10件库存。但这种方式实现极为复杂,暂不考虑。
  2. RocketMq柔性事务替换Seata AT刚性事务。
  3. 使用Seata AT+TCC混合事务。