AT模式
一阶段:
-
向seata server端申请全局事务id,传递给下游参与服务
-
执行各个本地事务,在事务执行前后记录seata自己的undo log/imag (用于回滚)到表中,该表为根据官网手动创建
-
各个本地事务申请全局锁
-
申请成功提交本地事务
二阶段:提交分布式事务,释放全局锁,删除对应的undolog/image
存在的问题
1. 全局锁的作用:基于锁的原理,对于同一个行数据,一个时刻只能有一个分布式事务执行,提供互斥的作用
2. 本地事务为什么在一阶段提交:为了提高性能,AT模式基于2PC的,但2PC的一阶段并不会真正提交本地事务,也就意味着一直持有资源不释放,性能较差,但AT模式在一阶段提交了本地事务,其他本地事务就可以执行,但全局锁还没有释放,同时还有undolog image的记录,来保证后续有异常仍然能够进行事务回滚,提高性能
3. 为什么全局锁不在本地事务开始时直接加锁:为了提高性能,减少全局锁对数据库的占用时间
4. AT模式的隔离级别:读未提交,因为当一阶段本地事务提交之后,其他的分布式事务已经可以看到提交后的数据,但因为有全局锁的存在,此时全局锁还没有释放,只能读到数据不能写数据
5. 全局锁带来的性能问题:因为有全局的存在,所有的分布式事务只能串行执行,不能并发的操作数据库中的数据
分支事务提交后,遇到异常回滚时,其他的本地事务修改了数据,此时seata会默认抛出异常