Seata AT详解

356 阅读3分钟

1.应用端启动日志

下面只贴出关键信息:

<!-- 1 -->
main [traceId= ] [SpanId= ] i.s.s.b.a.SeataAutoConfiguration Automatically configure Seata
...
<!-- 2 -->
main [traceId= ] [SpanId= ] i.s.c.r.n.NettyClientChannelManager will connect to 127.0.0.1:8091
main [traceId= ] [SpanId= ] i.s.c.r.n.NettyPoolableFactory NettyPool create channel to transactionRole:TMROLE,address:127.0.0.1:8091,msg:< RegisterTMRequest{applicationId='application-a', transactionServiceGroup='default_tx_group'} >
<!-- 3 -->
main [traceId= ] [SpanId= ] i.s.c.r.n.TmNettyRemotingClient register TM success. client version:1.5.2, server version:1.5.2,channel:[id: 0xb7472379, L:/127.0.0.1:64235 - R:/127.0.0.1:8091]
main [traceId= ] [SpanId= ] i.s.c.r.n.NettyPoolableFactory register success, cost 153 ms, version:1.5.2,role:TMROLE,channel:[id: 0xb7472379, L:/127.0.0.1:64235 - R:/127.0.0.1:8091]
main [traceId= ] [SpanId= ] i.s.s.a.GlobalTransactionScanner Transaction Manager Client is initialized. applicationId[application-a] txServiceGroup[default_tx_group]
...
<!-- 4 -->
main [traceId= ] [SpanId= ] i.s.r.d.xa.ResourceManagerXA ResourceManagerXA init ...
...
main [traceId= ] [SpanId= ] i.s.s.a.GlobalTransactionScanner Resource Manager is initialized. applicationId[application-a] txServiceGroup[default_tx_group]
main [traceId= ] [SpanId= ] i.s.s.a.GlobalTransactionScanner Global Transaction Clients are initialized. 
...
<!-- 5 -->
main [traceId= ] [SpanId= ] i.s.s.a.GlobalTransactionScanner Bean[com.onepiece.picture.endpoint.seatademo.SeataEndpoint$$EnhancerBySpringCGLIB$$ce85d5b1] with name [seataEndpoint] would use interceptor [io.seata.spring.annotation.GlobalTransactionalInterceptor]
...
<!-- 6 -->
main [traceId= ] [SpanId= ] i.s.c.r.n.RmNettyRemotingClient RM will register :jdbc:mysql://mysql-server.8btc-vpc.com:3306/xxx_xxx
main [traceId= ] [SpanId= ] i.s.c.r.n.NettyPoolableFactory NettyPool create channel to transactionRole:RMROLE,address:127.0.0.1:8091,msg:< RegisterRMRequest{resourceIds='jdbc:mysql://mysql-server.8btc-vpc.com:3306/xxx_xxx', applicationId='application-a', transactionServiceGroup='default_tx_group'} >
main [traceId= ] [SpanId= ] i.s.c.r.n.RmNettyRemotingClient register RM success. client version:1.5.2, server version:1.5.2,channel:[id: 0xefec1cc9, L:/127.0.0.1:64319 - R:/127.0.0.1:8091]
main [traceId= ] [SpanId= ] i.s.c.r.n.NettyPoolableFactory register success, cost 61 ms, version:1.5.2,role:RMROLE,channel:[id: 0xefec1cc9, L:/127.0.0.1:64319 - R:/127.0.0.1:8091]
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
  1. SeataAutoConfiguration执行
  2. 连接上seata-server
  3. register TM success
  4. ResourceManagerXA init
  5. 发现需要开启分布式事务的位置
  6. RM register

2.seata-server 伴随应用启动日志

<!-- 1 -->
INFO --- [ttyServerNIOWorker_1_3_16] i.s.c.r.processor.server.RegTmProcessor  : TM register success,message:RegisterTMRequest{applicationId='application-a', transactionServiceGroup='default_tx_group'},channel:[id: 0x24e19073, L:/127.0.0.1:8091 - R:/127.0.0.1:64235],client version:1.5.2
<!-- 2 -->
INFO --- [rverHandlerThread_1_2_500] i.s.c.r.processor.server.RegRmProcessor  : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://mysql-server.8btc-vpc.com:3306/xxx_xxx', applicationId='application-a', transactionServiceGroup='default_tx_group'},channel:[id: 0x55b46694, L:/127.0.0.1:8091 - R:/127.0.0.1:64319],client version:1.5.2
  1. TM register success
  2. RM register success

3. Begin new global transaction 相关信息

应用端日志

[traceId= 30011d9c86e05b82] [SpanId= 30011d9c86e05b82] i.s.t.a.DefaultGlobalTransaction Begin new global transaction [10.8.0.14:8091:6764743828138625962]

服务端日志

INFO --- [rverHandlerThread_1_3_500] i.s.s.coordinator.DefaultCoordinator     : Begin new global transaction applicationId: application-a,transactionServiceGroup: default_tx_group, transactionName: test(),timeout:3600000,xid:10.8.0.14:8091:6764743828138625962

分布式事务默认超时时间为60s

seata 数据库

具体表详见《Seata 部署&使用AT+TCC模式》

global_table

xid	transaction_id	status	application_id	transaction_service_group	transaction_name	timeout	begin_time	application_data	gmt_create	gmt_modified
10.8.0.14:8091:6764743828138625962	6764743828138625962	1	application-a	default_tx_group	test()	3600000	1670759846823		2022-12-11 11:57:26	2022-12-11 11:57:26
  • status为1表示全局事务开始
  • application_id表示开启分布式事务的应用标识
  • transaction_name:事务名。这里是被@GlobalTransactional注释的方法。
  • timeout:事务超时时间

branch_table

branch_id	xid	transaction_id	resource_group_id	resource_id	branch_type	status	client_id	application_data	gmt_create	gmt_modified
6764743828138625982	10.8.0.14:8091:6764743828138625962	6764743828138625962		jdbc:mysql://mysql-server.8btc-vpc.com:3306/application-b	AT	0	application-b:127.0.0.1:49491		2022-12-11 12:53:51.043356	2022-12-11 12:53:51.043356
  • resource_id:mysql url
  • client_id:客户端id,name+ip+端口。

lock_table

row_key	xid	transaction_id	branch_id	resource_id	table_name	pk	status	gmt_create	gmt_modified
jdbc:mysql://mysql-server.8btc-vpc.com:3306/application-b^^^sa_artwork_series_ratio^^^0	10.8.0.14:8091:6764743828138625962	6764743828138625962	6764743828138625982	jdbc:mysql://mysql-server.8btc-vpc.com:3306/application-b	sa_artwork_series_ratio	0	0	2022-12-11 12:53:51	2022-12-11 12:53:51
  • row_key:行key。这里为mysql url+表名+主键

undo_log

branch_id	xid	context	rollback_info	log_status	log_created	log_modified
6764743828138625982	10.8.0.14:8091:6764743828138625962	serializer=jackson&compressorType=NONE	{"@class":"io.seata.rm.datasource.undo.BranchUndoLog","xid":"10.8.0.14:8091:6764743828138626373","branchId":6764743828138626382,"sqlUndoLogs":["java.util.ArrayList",[{"@class":"io.seata.rm.datasource.undo.SQLUndoLog","sqlType":"DELETE","tableName":"sa_artwork_series_ratio","beforeImage":{"@class":"io.seata.rm.datasource.sql.struct.TableRecords","tableName":"sa_artwork_series_ratio","rows":["java.util.ArrayList",[{"@class":"io.seata.rm.datasource.sql.struct.Row","fields":["java.util.ArrayList",[{"@class":"io.seata.rm.datasource.sql.struct.Field","name":"utime","keyType":"NULL","type":93,"value":null},{"@class":"io.seata.rm.datasource.sql.struct.Field","name":"ctime","keyType":"NULL","type":93,"value":["java.sql.Timestamp",1670576248000]},{"@class":"io.seata.rm.datasource.sql.struct.Field","name":"artwork_series_id","keyType":"PRIMARY_KEY","type":-5,"value":["java.lang.Long",0]},{"@class":"io.seata.rm.datasource.sql.struct.Field","name":"ratio","keyType":"NULL","type":12,"value":"test"}]]}]]},"afterImage":{"@class":"io.seata.rm.datasource.sql.struct.TableRecords$EmptyTableRecords","tableName":"sa_artwork_series_ratio","rows":["java.util.ArrayList",[]]}}]]}	0	2022-12-11 21:11:48.502465	2022-12-11 21:11:48.502465
  • context:内容,包含了一些技术信息。这里为serializer=jackson&compressorType=NONE
  • rollback_info:回滚信息
{
    "@class": "io.seata.rm.datasource.undo.BranchUndoLog",
    "xid": "10.8.0.14:8091:6764743828138626373",
    "branchId": 6764743828138626382,
    "sqlUndoLogs": [
        "java.util.ArrayList",
        [
            {
                "@class": "io.seata.rm.datasource.undo.SQLUndoLog",
                "sqlType": "DELETE",
                "tableName": "sa_artwork_series_ratio",
                "beforeImage": {
                    "@class": "io.seata.rm.datasource.sql.struct.TableRecords",
                    "tableName": "sa_artwork_series_ratio",
                    "rows": [
                        "java.util.ArrayList",
                        [
                            {
                                "@class": "io.seata.rm.datasource.sql.struct.Row",
                                "fields": [
                                    "java.util.ArrayList",
                                    [
                                        {
                                            "@class": "io.seata.rm.datasource.sql.struct.Field",
                                            "name": "utime",
                                            "keyType": "NULL",
                                            "type": 93,
                                            "value": null
                                        },
                                        {
                                            "@class": "io.seata.rm.datasource.sql.struct.Field",
                                            "name": "ctime",
                                            "keyType": "NULL",
                                            "type": 93,
                                            "value": [
                                                "java.sql.Timestamp",
                                                1670576248000
                                            ]
                                        },
                                        {
                                            "@class": "io.seata.rm.datasource.sql.struct.Field",
                                            "name": "artwork_series_id",
                                            "keyType": "PRIMARY_KEY",
                                            "type": -5,
                                            "value": [
                                                "java.lang.Long",
                                                0
                                            ]
                                        },
                                        {
                                            "@class": "io.seata.rm.datasource.sql.struct.Field",
                                            "name": "ratio",
                                            "keyType": "NULL",
                                            "type": 12,
                                            "value": "test"
                                        }
                                    ]
                                ]
                            }
                        ]
                    ]
                },
                "afterImage": {
                    "@class": "io.seata.rm.datasource.sql.struct.TableRecords$EmptyTableRecords",
                    "tableName": "sa_artwork_series_ratio",
                    "rows": [
                        "java.util.ArrayList",
                        []
                    ]
                }
            }
        ]
    ]
}

里面有xid、branchId、sqlType(这里为DELETE)、tableName(这里为sa_artwork_series_ratio)、beforeImage(记录了提交前的数据状态,只记录会变化的值)、afterImage(记录了提交后的数据状态,只记录会变化的值),利用这些值生成回滚sql。

回滚日志

INFO rpcDispatch_RMROLE_1_1_16 [traceId= ] [SpanId= ] i.s.c.r.p.c.RmBranchRollbackProcessor rm handle branch rollback process:xid=10.8.0.14:8091:6764743828138625962,branchId=6764743828138625982,branchType=AT,resourceId=jdbc:mysql://mysql-server.8btc-vpc.com:3306/application-b,applicationData=null
INFO rpcDispatch_RMROLE_1_1_16 [traceId= ] [SpanId= ] io.seata.rm.AbstractRMHandler Branch Rollbacking: 10.8.0.14:8091:6764743828138625962 6764743828138625982 jdbc:mysql://mysql-server.8btc-vpc.com:3306/application-b
INFO rpcDispatch_RMROLE_1_1_16 [traceId= ] [SpanId= ] i.s.r.d.u.AbstractUndoLogManager xid 10.8.0.14:8091:6764743828138625962 branch 6764743828138625982, undo_log deleted with GlobalFinished
running 2022-12-11 21:00:17.511 INFO rpcDispatch_RMROLE_1_1_16 [traceId= ] [SpanId= ] io.seata.rm.AbstractRMHandler Branch Rollbacked result: PhaseTwo_Rollbacked

回滚删除undo_log

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情