2.5.4 XA事务的记录
2.5.4.1 XA 事务过程中记录的内容
由于在Dble中采用两段提交的分布式事务,所以使用XA事务的时候对于DBLE本身就拥有了状态。状态就需要有文件或者其他方式的记录,其中关于XA事务细节的记录主要是记录以下几个部分
1. 事务ID
2. 事务状态
3. 事务中每个节点的连接host
4. 事务中每个节点的连接端口
5. 事务中每个节点连接最后的事务状态
6. 事务中每个节点连接的过期状态(没有实际作用)
7. 事务中每个节点连接对应的后端数据库
这里举例一个记录的实例
{
"id": "'Dble_Server.1.15'",
"state": "8",
"participants": [
{
"host": "10.186.24.37",
"port": "3308",
"p_state": "8",
"expires": 0,
"schema": "db3",
"tableName": "testdb.test1",
"repeatTableIndex": 0
},
{
"host": "10.186.24.37",
"port": "3306",
"p_state": "8",
"expires": 0,
"schema": "db2",
"tableName": "testdb.test2",
"repeatTableIndex": 0
},
{
"host": "10.186.24.37",
"port": "3308",
"p_state": "8",
"expires": 0,
"schema": "db2",
"tableName": "testdb.test3",
"repeatTableIndex": 0
},
{
"host": "10.186.24.37",
"port": "3306",
"p_state": "8",
"expires": 0,
"schema": "db1",
"tableName": "testdb.test4",
"repeatTableIndex": 0
}
]
}
2.5.4.2 XA事务中status的标识字典
status | 状态 | 解释 |
---|---|---|
0 | TX_INITIALIZE_STATE |
XA事务处于初始化状态 |
1 | TX_STARTED_STATE |
XA事务处于开始状态,在事务开始直到提交或者回滚之前 XA事务的状态一直会保持此状态 |
2 | TX_ENDED_STATE |
XA END下发成功状态 |
3 | TX_PREPARED_STATE |
XA PREPARED成功状态 |
4 | TX_PREPARE_UNCONNECT_STATE |
XA PREPARED下发过程中连接被断开 |
5 | TX_COMMIT_FAILED_STATE |
XA COMMIT 下发失败 |
6 | TX_ROLLBACK_FAILED_STATE |
XA ROLLBACK 失败 |
7 | TX_CONN_QUIT |
后端mysql连接失败 |
8 | TX_COMMITTED_STATE |
XA 事务提交成功 |
9 | TX_ROLLBACKED_STATE |
XA 事务回滚成功 |
10 | TX_COMMITTING_STATE |
XA 事务正在提交 |
11 | TX_ROLLBACKING_STATE |
XA 事务正在回滚 |
12 | TX_PREPARING_STATE |
XA 事务正在下发prepare |
2.5.4.3 XA事务记录的存储方式
一、本地文件方式
顾名思义在这种方式下,xa事务的状态将以本地记录文件的方式被存放到对应的文件中,具体的路径和文件名配置是
配置与bootstrap.cnf中的{xaRecoveryLogBaseDir}/{XaRecoveryLogBaseName}.log默认条件下文件会被储存在./xalogs/xalog-1.log
一般只在Dble单机状态下使用本地文件方式,使用集群时本地文件的方式将在集群状态下造成不可预知的错误
二、ZK存储方式
ZK存储方式不需要额外的配置,当Dble使用ZK配置时,自动默认XA事务记录的存储方式也会是ZK存储
具体的XA事务记录的内容保持不变,记录在dble/{clusterId}/XALOG/{myid} 的Key值中
2.5.4.4 其他补充
参与记录规则
1、仅Sharding用户执行的相关事务,参与记录(RwSplit用户不参与统计);
2、有效(真正意义上的开启或结束显式事务)的事务控制语句,如begin等,参与记录;
3、事务中,Modify类型sql,都参与记录;
4、非事务中,Modify类型且实际下发多个节点的sql,才参与记录;
(Modify定义:具有修改数据或结构的sql)