Narayana事务Commit流程

Narayana commit 流程

整体流程

事务提交
    判断是否能进行一阶段提交优化
        若能一阶段提交
            执行一阶段提交
        否则
            二阶段提交
                prepare阶段
                    执行 xa end
                    执行 xa prepare
                        xaResourceRecord 插入到 preparedList
                            BasicAction#insertRecord
                        更新状态 ActionStatus.COMMITTING
                        保存状态,打包状态到 outputBuffer 里
                            XAResourceRecord#save_state
                        写入日志到存储
                            FileSystemStore#write_committed
                commit阶段
                    更新状态为 ActionStatus.COMMITTING
                    执行 xa commit;
                        可以线程池异步提交
                    更新状态为 ActionStatus.COMMITTED
                    更新状态到日志 BasicAction#updateState
                        从日志中移除状态 FileSystemStore#remove_committed
                    清空数据

使用

TransactionManager transactionManager = jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager();
// 开启事务
transactionManager.begin();
// 执行 sql 语句
// ...
// 提交事务
transactionManager.commit();

调用链路

阶段1: xa end + xa prepare

com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction#commit
    com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#getTransaction
        com.arjuna.ats.arjuna.coordinator.BasicAction#Current
            com.arjuna.ats.internal.arjuna.thread.ThreadActionData#currentAction
                com.arjuna.ats.internal.arjuna.thread.ThreadActionData#setup
    com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#commitAndDisassociate
        com.arjuna.ats.arjuna.coordinator.BasicAction#status
        com.arjuna.ats.arjuna.AtomicAction#commit
            com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator#end
                com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator#beforeCompletion
                com.arjuna.ats.arjuna.coordinator.BasicAction#End
                    com.arjuna.ats.arjuna.coordinator.BasicAction#doOnePhase
                    是否可以执行一阶段提交优化
                        com.arjuna.ats.arjuna.coordinator.RecordList#size
                        判断 RecordList 大小为1则可以执行一阶段优化
                    com.arjuna.ats.arjuna.coordinator.BasicAction#prepare
                    执行 xa end + xa prepare
                        com.arjuna.ats.arjuna.coordinator.BasicAction#criticalStart
                        com.arjuna.ats.arjuna.coordinator.BasicAction#createPreparedLists
                        创建 prepared list
                        com.arjuna.ats.arjuna.coordinator.BasicAction#doPrepare
                        遍历所有节点,依次执行 xa end + xa prepare
                            com.arjuna.ats.arjuna.coordinator.RecordList#size
                            com.arjuna.ats.arjuna.coordinator.RecordList#getFront
                            com.arjuna.ats.arjuna.coordinator.BasicAction#doPrepare
                            节点1执行 xa end + xa prepare
                                com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#topLevelPrepare
                                    com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#toString
                                        com.arjuna.ats.jta.xa.XidImple#toString
                                    com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#order
                                    com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#endAssociation
                                    执行 xa end
                                        com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#endAssociation
                                            com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#getXAResourceState
                                                com.arjuna.ats.internal.jta.xa.TxInfo#getState
                                            com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#doEnd
                                            调用 RM 执行 xa end 操作
                                                com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#setXAResourceState
                                    com.zc.transaction.xa.SingleXACtrlResource#prepare
                                    调用 RM 执行 xa prepare
                                com.arjuna.ats.arjuna.coordinator.BasicAction#insertRecord
                                插入到 preparedList
                            com.arjuna.ats.arjuna.coordinator.BasicAction#doPrepare
                            节点2执行 xa end + xa prepare,流程和上面完全相同
                                ......
                        com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#doSave
                        com.arjuna.ats.arjuna.coordinator.BasicAction#preparedStatus
                        更新事务状态为 ActionStatus.COMMITTING
                        com.arjuna.ats.arjuna.coordinator.BasicAction#save_state
                        保存状态到 outputBuffer
                            com.arjuna.ats.arjuna.StateManager#packHeader
                            com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#save_state
                        com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#write_committed
                        事务状态写到存储
                            com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#write_state_internal
                                com.arjuna.ats.internal.arjuna.objectstore.ShadowingStore#write_state
                                    com.arjuna.ats.internal.arjuna.objectstore.ShadowingStore#genPathName
                                            com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#getStoreName
                                            com.arjuna.ats.arjuna.objectstore.ObjectStore#locateStore
                                            定位到存储文件
                                    com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#openAndLock
                                    加文件锁
                                        com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#openAndLockInternal
                                            com.arjuna.ats.internal.arjuna.objectstore.ShadowNoFileLockStore#lock
                                    com.arjuna.ats.arjuna.state.OutputBuffer#buffer
                                    com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#synchronousWrites
                                    文件系统:同步写
                                    com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#closeAndUnlock
                                    解文件锁
                                    com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#addToCache
                                    缓存事务状态
                        com.arjuna.ats.arjuna.coordinator.BasicAction#criticalEnd

阶段2: xa commit

com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction#commit
    com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#getTransaction
        com.arjuna.ats.arjuna.coordinator.BasicAction#Current
            com.arjuna.ats.internal.arjuna.thread.ThreadActionData#currentAction
                com.arjuna.ats.internal.arjuna.thread.ThreadActionData#setup
    com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#commitAndDisassociate
        com.arjuna.ats.arjuna.coordinator.BasicAction#status
        com.arjuna.ats.arjuna.AtomicAction#commit
            com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator#end
                com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator#beforeCompletion
                com.arjuna.ats.arjuna.coordinator.BasicAction#End
            // 省略1阶段流程......
            com.arjuna.ats.arjuna.coordinator.BasicAction#phase2Commit
            阶段2执行 xa commit
                com.arjuna.ats.arjuna.coordinator.BasicAction#criticalStart
                com.arjuna.ats.arjuna.coordinator.BasicAction#doCommit
                    com.arjuna.ats.arjuna.coordinator.BasicAction#doCommit
                        com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#toString
                            com.arjuna.ats.jta.xa.XidImple#toString
                        com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#topLevelCommit
                            com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#toString
                            com.zc.transaction.xa.SingleXACtrlResource#commit
                            调用 RM 执行 xa commit
                            com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord#removeConnection
                        com.arjuna.ats.arjuna.coordinator.BasicAction#updateHeuristic
                    com.arjuna.ats.arjuna.coordinator.BasicAction#doCommit
                    资源2执行二阶段 xa commit,流程同上
                    ......
                com.arjuna.ats.arjuna.coordinator.BasicAction#updateState
                更新状态到日志
                    com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#remove_committed
                    从日志中移除状态
                        com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#remove_state_internal
                            com.arjuna.ats.internal.arjuna.objectstore.ShadowingStore#remove_state
                                com.arjuna.ats.arjuna.objectstore.StateType#stateTypeString
                                com.arjuna.ats.internal.arjuna.objectstore.ShadowingStore#currentState
                                    com.arjuna.ats.internal.arjuna.objectstore.ShadowingStore#genPathName
                                        com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#genPathName
                                            com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#getStoreName
                                            文件名
                                            com.arjuna.ats.arjuna.objectstore.ObjectStore#locateStore
                                            定位存储
                                    com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#exists
                                    com.arjuna.ats.internal.arjuna.objectstore.ShadowingStore#genPathName
                                com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#openAndLock
                                com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#closeAndUnlock
                                com.arjuna.ats.internal.arjuna.objectstore.FileSystemStore#removeFromCache
                                移除缓存
        com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator#afterCompletion
    com.arjuna.ats.internal.arjuna.thread.ThreadActionData#popAction
    移除 ThreadActionData 缓存
    com.arjuna.ats.arjuna.coordinator.TransactionReaper#transactionReaper
    移除 TransactionReaper 缓存
    com.arjuna.ats.arjuna.coordinator.TransactionReaper#remove
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple#removeTransaction
移除 TransactionImple 缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingZCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值