< titlesplit >一、业务背景在分布式架构中,事务管理是一个无法回避的复杂问题。虽然解决方案很多,但还是要根据业务选择合适的;根据实践经验,Seata组件的AT模式是比较常用的。本文从一个实际案例出发,深入分析该模式的原理;首先,创建全局事务管理的接口,这里是在Facade服务中开启全局事务;请求经过三个A微服务,每个服务操作数据源,然后模拟链接成功和异常,分析不同状态的逻辑实现;二、Seata架构1、核心组件TC的三大组件:事务协调器是TransactionCoordinator,维护全局和分支事务的状态,驱动全局事务的提交或回滚。TM:事务管理器即TransactionManager,它定义了全局事务的范围,启动事务,提交事务,回滚事务。RM:资源管理器即资源管理器,负责管理分支事务的资源,向TC注册分支事务,报告分支事务的状态,驱动分支事务提交或回滚。基础交互TC是一个需要独立部署的服务。TM和RM集成在服务中。三个组件相互配合完成分布式事务的管理;2、AT模式事务模型AT是Seata默认的模式,需要支持本地ACID关系数据库进行事务处理;Java应用,通过JDBC访问数据库;基于案例流程,首先分析AT的交易模型;2.1TM负责定义全局事务的边界,向TC申请启动全局事务;2.2全局事务创建成功后,生成一个全局唯一的XID;2.3XID会在微服务请求链接上下文中传播;2.4RM向TC注册一个分支事务,并分配给XID对应的全局事务进行调度;2.5TM发起全局事务提交或Rollback决议;2.6TC完成XID管理的所有分支事务的提交或回滚调度;核心机制执行阶段:每个微服务请求完成后,基于本地数据库的事务能力,保证业务数据和回滚日志在同一个本地事务中Commit,快速释放连接并锁定资源;完成阶段:全局提交完成,分支事务已经提交,会清理回滚日志,快速结束流程;全局回滚根据XID和BranchID查询回滚日志,数据回滚完成;数据源代理为AT模式,应用需要使用Seata组件中的JDBC代理数据源DataSourceProxy实现对真实目标数据源的代理访问;三、案例分析1、流程分析案例的简单描述案例中涉及三个服务。Facade服务启动全局事务,然后分别请求Account和Quartz服务的更新接口。调试AT模式的原理是查看Quartz接口是否抛出异常。从实际请求执行来看,大部分请求都是可以执行成功的,而AT方式的异步提交最大程度兼顾了全局事务的效率,少数失败也可以进行反向补偿通过回滚日志;2.写隔离上面的流程分析AT模式属性的原子,即多个分支事务要么成功要么失败,然后分析多个事务中的全局锁隔离机制,先看写隔离,假设TX1先开始;TX1逻辑TX1启动本地事务,获取本地锁,然后执行更新操作;TX1的本地事务提交前,需要先获取全局锁,否则无法提交;TX1获取全局锁并提交,释放局部锁,但不释放全局锁;TX2逻辑TX2此时启动本地事务,并获取本地锁;TX2在提交本地事务前尝试获取全局锁;由于全局锁由TX1持有,TX2将重试等待全局锁;假设TX1提交了全局事务,如果全局事务提交,TX1会释放全局锁;TX2获取全局锁成功,执行local交易提交;假设TX1全局回滚TX1如果全局事务回滚,必须重新获取数据的本地锁,进行回滚补偿动作;如果TX2还在等待全局锁,还持有本地锁,TX1事务回滚失败,会继续重试;当TX2等待全局锁超时时,会放弃全局锁,回滚本地事务,释放本地锁;TX1最终获取到数据的本地锁,完成回滚操作;一直持有全局锁,TX2无法获取到全局锁,无法对同一份数据进行更新动作,避免了脏写问题;3、在数据库本地隔离级别为readcommitted或以上的基础上,Seata的AT模式下默认的全局隔离级别为readuncommitted;如果需要globalreadcommitted,可以使用SELECTFORUPDATE语句的代理;这条语句的执行也需要获取一个全局锁。如果全局锁被TX1持有,TX2会释放本地锁,查询会阻塞重试,全局锁读取成功后返回;4、与XA模式相比XA是一种分布式事务段提交协议;事务管理器是TM:作为全局事务的调度器,负责整个事务中本地资源的提交和回滚;本地资源管理器是RM:大部分关系型数据库都实现了XA接口;TM首先向所有参与交易的RM发送确认请求,根据确认的结果,判断是调用RM的commit还是rollback;XA具有很强的一致性。在两阶段提交过程中,它将持有资源锁。如果是在事务顺序等复杂环节,并且并发量非常高,就会存在长事务的风险,XA无法满足这种高并发场景;Seata的AT模式下,服务执行完成后,直接进行RM提交和资源释放,为CAP理论提供了一个相对均衡的解决方案5.参考源码应用仓库:https://gitee.com/cicadasmile/butte-flyer-parent组件打包:https://gitee.com/cicadasmile/butte-frame-parent
