问题描述:在多线程并发访问 AT 模式的分布式事务时,有可能出现脏写问题。当事务 1 因为某些原因要恢复快照时,另一个线程的事务 2 白更新了一次数据,出现了脏写问题。
- 解决思路:由TC记录当前正在操作某项数据的业务,该事务持有全局锁。拿不到锁的数据回滚,避免重复写问题。
- 如果出现分别拿到DB锁和全局锁,造成死锁的问题。一般全局锁等待时间大大小于数据库锁等待时间,可以解决。
- 相比于XA模式,TC模式全局锁由TC记录seata管理的操作,XA模式是数据库锁。因此AT模式应该比XA模式效率要好很多。
- 在上述阶段,如果出现非seata管理业务恰好同时修改数据,此时还是会造成脏读问题。但是这种概率是非常小的,因为业务大多数时候是成功的,少数才会回滚。设计系统的时候也需要尽量避免不一样的事物去操作同一字段。如果出现,需要报警,并进行人工干预。