seata分布式事务~AT模式 ~ langhai

林书豪
2023-01-10 12:32:24
seata分布式事务~AT模式 浪海值:1033度
文章标签:seata分布式事务
文章摘要:待更新
使用新的显示器:新的显示器 如果遇到图片单击即可放大/缩小。

seata分布式事务~AT模式

AT模式同样是分阶段提交的事务模型,但是它弥补了XA模式的资源锁定周期过长的缺陷。

这里RM第一阶段的工作,和XA模式不同的是,它执行完成业务SQL之后,直接提交。但是这里需要注意的是,RM会在这是对数据变化前后生成快照

RM第二阶段,如果是事务提交,那么只需要删除undo-log即可,就是删除生成的数据快照。如果是事务要进行回滚,那么依据undo-log数据快照恢复到更新之前的状态。

XA模式是强一致性的,AT模式是最终一致的。

AT模式在db锁的基础上引入了全局锁实现读写隔离。

AT模式实现:

第一步需要在seata服务关联的数据库中加入全局锁表结构。

DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table`  (
  `row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_id` bigint(20) NULL DEFAULT NULL,
  `branch_id` bigint(20) NOT NULL,
  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` datetime NULL DEFAULT NULL,
  `gmt_modified` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`row_key`) USING BTREE,
  INDEX `idx_branch_id`(`branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

还需要在参与分布式事务的微服务关联数据库中加入数据快照的表结构。

DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (
  `branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',
  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'global transaction id',
  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'undo_log context,such as serialization',
  `rollback_info` longblob NOT NULL COMMENT 'rollback info',
  `log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',
  `log_created` datetime(6) NOT NULL COMMENT 'create datetime',
  `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = Compact;

第二步修改配置文件,同样需要在分布式事务的入口加上分布式事务注解。

// 这里是你调用的接口,分布式事务的入口,一般是service类的某个方法。
@GlobalTransactional
seata:
  data-source-proxy-mode: AT # 默认就是AT

最后在控制台观察回滚信息:

// AT模式
branchType=AT

// 使用到的是undo_log快照表
undo_log deleted with GlobalFinished

// 成功进行回滚操作,数据没有发生变化。
Branch Rollbacked result: PhaseTwo_Rollbacked


有任何问题联系 QQ 676558206 email [email protected] [email protected]


提交评论