Narayana commit 流程

整体流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
事务提交
判断是否能进行一阶段提交优化
若能一阶段提交
执行一阶段提交
否则
二阶段提交
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
清空数据

使用

1
2
3
4
5
6
7
TransactionManager transactionManager = jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager();
// 开启事务
transactionManager.begin();
// 执行 sql 语句
// ...
// 提交事务
transactionManager.commit();

调用链路

阶段1: xa end + xa prepare

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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 缓存