分布式事务组件Seata 设计流程分析
2024-10-18 15:44:01 0 举报
分布式事务组件Seata设计流程分析
作者其他创作
大纲/内容
全局事务状态从Begin改为Rollbacking
AbstractUndoLogManager#batchDeleteUndoLog
globalSession.changeGlobalStatus(GlobalStatus.Committed)
全局事务提交
DefaultCoordinator#doGlobalBegin
分支事务对undolog的处理:校验,删除
implements
执行业务回滚逻辑:UPDATE storage_tbl SET count = ? WHERE id = ?
DefaultCore#doGlobalRollback
如果返回branchStatus为PhaseTwo_Committed,删除分支事务信息
提交本地事务
发起BranchCommitRequest请求
globalSession.end()
BranchStatus.PhaseOne_Failed
BranchSession#unlock()
用户下单
BranchStatus.PhaseTwo_Committed
返回两阶段回滚状态
查询当前的记录
DefaultCoordinator#doGlobalCommit
DefaultTransactionManager#begin
发起GlobalCommitRequest请求
删除branch_table表对应分支事务信息: delete from branch_table where xid = ? and branch_id = ?
返回两阶段提交状态
遍历分支事务,执行分支事务的提交
globalSession.closeAndClean()
globalSession.changeGlobalStatus(GlobalStatus.Rollbacked)
LockStoreDataBaseDAO#unLock
queryCurrentRecords(conn)
不相等继续比较前置镜像和当前记录,如果相等不执行回滚操作,如果不相等,抛出异常
AbstractCore#branchCommit
SessionHelper#removeBranch
LogStoreDataBaseDAO#updateGlobalTransactionDO
发起远程调用,通知对应的RM删除undo_log
AsyncWorker#addToCommitQueue
保存到global_table表中
前置镜像和后置镜像相等,不需要执行回滚操作
UndoLogManager
AbstractRMHandler#handle(BranchRollbackRequest request)
MethodInterceptor
DefaultCoordinator#doGlobalRollback
角色:GlobalTransactionRole.Launcher
发起BranchRollbackRequest请求
LogStoreDataBaseDAO#deleteBranchTransactionDO
DefaultTransactionManager#rollback
AbstractRMHandler#handle(BranchCommitRequest request)
selectPST.executeQuery()
TC
ResourceManager
查询undolog记录:SELECT * FROM undo_log WHERE branch_id = ? AND xid = ? FOR UPDATE
删除lock_table对应全局锁记录delete from lock_table where xid = ? and branch_id = ?
seata对于commit的异步优化:DefaultCoordinator#init方法中通过定时线程池轮询处理AsyncCommitting任务
释放全局锁,仅支持AT模式
undoExecutor.executeOn(conn)
释放全局锁
删除global_table表对应的全局事务信息
AsyncWorker#deleteUndoLog
删除undolog日志
处理分支事务回滚请求
GlobalTransactionalInterceptor#invoke
globalSession.asyncCommit()
AbstractCore#branchRollback
遍历BranchSession,删除第一阶段失败的分支事务信息
更新全局事务状态为Rollbacked
删除global_table表对应的全局事务信息delete from global_table where xid = ?
DefaultTransactionManager#commit
全局事务状态从Begin改为AsyncCommitting
BranchType.AT
发起GlobalRollbackRequest请求
BranchStatus.PhaseTwo_Rollbacked
transactionStoreManager#writeSession
比较后置镜像和当前记录数据是否相等
LogStoreDataBaseDAO#deleteGlobalTransactionDO
AsyncWorker#doBranchCommitSafely
更新全局事务状态为Committed
conn.commit()
当前数据库的记录和后置镜像,前置镜像的数据都不同等,抛出脏写异常,不执行回滚逻辑,也就意味着分支事务回滚失败,导致整个分布式事务无法继续进行
全局事务回滚
TransactionStoreManager
DefaultCoordinator#handleAsyncCommitting
TransactionManager
DataSourceManager#branchCommit
undoPST.executeUpdate()
利用定时任务线程池从commitQueue队列取任务进行处理
发起GlobalBeginRequest请求
全局事务管理器接口
开启全局事务,发起远程调用,返回xid
UndoLog管理接口
异步提交
删除branch_table表对应分支事务信息
TransactionalTemplate#execute
存储全局事务信息(GlobalSession)
资源管理器接口
RM
TM
dataValidationAndGoOn(conn
DataSourceManager#branchRollback
LogStoreDataBaseDAO#insertGlobalTransactionDO
删除lock_table对应全局锁记录
@GlobalTransactional
删除undo_log日志
分支事务commit异步设计,提交任务到commitQueue队列
undolog校验逻辑
globalSession.changeGlobalStatus(GlobalStatus.Rollbacking)
UndoLogManager#undo
处理分支事务的提交请求
0 条评论
下一页