Java小强个人技术博客站点    手机版
当前位置: 首页 >> Java >> Seata之AT 模式的使用

Seata之AT 模式的使用

35720 Java | 2022-2-7

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。

Windows上安装Seata服务http://www.javacui.com/tool/622.html 

Windows安装Nacoshttp://www.javacui.com/opensource/603.html 

Seata之XA 模式的使用http://www.javacui.com/java/623.html 

官方说明http://seata.io/zh-cn/docs/dev/mode/at-mode.html 


整体机制

两阶段提交协议的演变:

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段:

提交异步化,非常快速地完成。

回滚通过一阶段的回滚日志进行反向补偿。


可以看到,与XT不同的是,AT业务数据会马上提交,不会占用数据库资源,同时使用日志进行数据回滚。

同时引入全局锁来避免脏写问题。

如果一个非seata管理的程序修改了数据,而同时被seata管理的程序发生了失败,此时seata是无法恢复数据的,这时需要手工修复数据


如果要使用AT模式,需要增加两张表,lock_table放到seata访问的数据库,undo_log每个模块连接的数据库都要有。

-- 注意此处0.7.0+ 增加字段 context
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
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 AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


修改配置

seata:
  data-source-proxy-mode: AT


相关代码从Seata之XA 模式的使用下载。

推荐您阅读更多有关于“ Seata Feign SpringCloud AT ”的文章

上一篇:Seata之TCC 模式的使用 下一篇:Seata之XA 模式的使用

猜你喜欢

发表评论: