分布式事务Seata源码解析:全局事务执行流程之两阶段全局事务提交
在分布式事务解决方案Seata中,两阶段提交是全局事务管理的核心。以下是全局事务提交的核心流程:
public void commit(GlobalStatus commitStatus) {
// 判断是否提交
if (commitStatus == GlobalStatus.Committed) {
// 1. 提交所有分支事务
for (BranchSession branchSession : branchSessions.values()) {
try {
resourceManagers.get(branchSession.getResourceId()).commit(branchSession, branchSession.getXid(), branchSession.getBranchId());
} catch (HeuristicMixedException e) {
// 处理异常情况
} catch (HeuristicRollbackException e) {
// 处理异常情况
}
}
// 2. 注册监听器,处理网络分片情况
for (BranchSession branchSession : branchSessions.values()) {
if (branchSession.getStatus() == BranchStatus.PhaseTwo_Committed) {
// 注册监听器
}
}
// 3. 清理资源
clear();
} else if (commitStatus == GlobalStatus.Rollbacked) {
// 回滚所有分支事务
for (BranchSession branchSession : branchSessions.values()) {
resourceManagers.get(branchSession.getResourceId()).rollback(branchSession, branchSession.getXid(), branchSession.getBranchId());
}
// 清理资源
clear();
}
}
这段代码展示了两阶段提交的核心逻辑。首先,它会遍历所有已注册的分支事务,并逐一提交它们。如果在提交过程中遇到异常,它会根据异常类型进行处理。之后,它会为每个已提交的分支事务注册网络分片的监听器,以处理网络分片的情况。最后,它会清理与这个全局事务相关的所有资源。如果事务需要回滚,它会遍历所有分支事务并回滚它们,然后清理资源。
评论已关闭