· TC (Transaction Coordinator)-事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
· TM (Transaction Manager)- 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
· RM (Resource Manager)-资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
一阶段:
·在业务执行SQL操作前,Seata通过代理数据源拦截SQL语句。
·如果业务SQL时写操作(增、删、改),Seata会解析SQL语义,生成SELECT SQL语句,查询出将要被修改的记录,并保存为“before image”
·执行业务SQL更新数据。
·执行完毕后,再次查询已被修改的记录,并保存为“after image”。
·根据“before image”和“after image”生成UNDO日志记录,并注册分支事务到TC(事务协调器)。
·提交本地事务,释放本地锁资源,但全局锁仍然持有。
二阶段:
·如果全局事务决策为提交,TC会通知RM(资源管理器)删除相应的UNDO日志记录,完成提交。
·如果全局事务决策为回滚,TC会通知RM根据UNDO日志记录进行数据回滚,恢复到事务开始前的状态。
隔离级别
·在数据库本地事务隔离级别读已提交(ReadCommitted)或以上的基础上,Seata(AT模式)的默认全局隔离级别是读未提交(ReadUncommitted)。
·如果应用在特定场景下必须要求全局的读已提交,Seata通过SELECTFORUPDATE语句的代理来实现。
·在执行SELECTFORUPDATE语句时,会申请全局锁,如果全局锁被其他事务持有,则释放本地锁并重试,直到获取全局锁,确保读取的数据是已提交的。
使用的锁机制:
·在一阶段本地事务提交前,需要确保先拿到全局锁,以保证不会发生写冲突。
·如果拿不到全局锁,不能提交本地事务。
·拿全局锁的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。
CAP原则:
·Seata的AT模式默认优先保证CP,即一致性和分区容错性。
·在TC不可用时,可以通过配置文件的tm.degrade-check参数或配置中心的service.disableGlobalTransaction属性,从CP系统转换为保证AP的系统,以优先保证服务的可用性。
标签:事务,Seata,流程,模式,提交,SQL,全局,TC
From: https://www.cnblogs.com/handsomelt/p/18462922