当前位置: 首页 > news >正文

分布式事务(Seata)——Seata分布式事务XA模式、AT模式、TCC模式的介绍和对比 结合案例分析AT模式和XA模式【源码】

在这里插入图片描述

前言

事务(TRANSACTION)是一个不可分割的逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交,要么都执行、要么都不执行。

事务作为系统中必须考虑的问题,无论是在单体项目还是在分布式项目中都需要进行处理,而尤其在分布式微服务调用的情况下,事务的处理就变得复杂。

本篇博客进行了Seata分布式事务XA模式、AT模式、TCC模式的介绍和对比,阐述了三种模式的联系和不同,并结合案例分析了seata的作用,对比了XA模式和AT模式下对执行其他操作的影响。

本篇博客源码以及seata1.4版本的安装包见下面git地址
https://gitee.com/pet365/seta-demo

在这里插入图片描述

关于分布式事务,CAP理论见下面博客:

分布式事务——CAP理论 & 解决分布式事务的思路 & Seata组件初识 和 部署

在这里插入图片描述
SpringCloud其他相关的组件博客文章合集如下:

【合集】Spring Cloud 组件——架构进化史话 & Eureka,Nacos,OpenFeign,Ribbon,Sentinel,Gateway . . .

在这里插入图片描述

目录

  • 前言
  • 引出
  • Seata分布式事务XA模式
    • 一、Java中分布式事务解决方案JTA
      • 1、什么是XA
      • 2、Java分布式事务的解决方案JTA(Java Transaction API)
    • 二、Seata XA模式
      • 1、执行阶段
      • 2、完成阶段
      • 3、XA模式的优缺点
      • 4、XA模式的思考
  • Seata分布式事务AT模式
    • 一、AT模式介绍
      • 1、AT摸式的原理
      • 2、执行流程
    • 二、AT模式的开发
      • 1、修改配置,准备undo_log表
      • 2、AT模式与XA模式
  • Seata分布式事务TCC模式
    • 一、TCC模式介绍
    • 二、案例分析
      • 1、Try阶段
      • 2、Confirm阶段
      • 3、Cancel阶段
  • 结合代码对比AT模式和XA模式
    • 开启全局事务AT模式
      • 1.超时导致的回滚+日志分析
      • 2.账户余额不足导致回滚
    • 如果未开启全局事务
    • 执行期间操作对比
      • AT模式
      • XA模式
  • 附录:
    • 1、账户account的SQL
    • 2、订单Order的SQL
    • 3、库存Storage的SQL
  • 总结

引出


1、XA规范使用两阶段提交(2PC,Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务。

  • 第一阶段为准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。
  • 第二阶段为提交阶段(commit)。当transaction manager确认所有参与者都ready)后,向所有参与者发送commit命令。

2、AT模式与XA模式

(1)Seata AT模式是两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

(2)AT模式与XA模式的区别

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚:AT模式利用数据快照实现数据回滚。
  • XA是强一致性;AT是最终一致性。

3、Tny-Confirm-Cancel,TCC模式

TCC是分布式事务中二阶段提交协议的实现,它的全称为Tny-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),具体含义如下:

  • Try(prepare)阶段:对业务资源的检查并预留。
  • Confirm(commit)阶段:对y业务处理进行提交,该步骤会对Ty预留的资源进行释放,只要Try成功,Confirm-一定要能成功.
  • Cancel(rollback)阶段:对业务处理进行取消,即回滚操作。

Seata分布式事务XA模式

一、Java中分布式事务解决方案JTA

1、什么是XA

  • XA规范是X/Open组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。
  • XA规范使用两阶段提交(2PC,Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务。
  • 第一阶段为准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。
  • 第二阶段为提交阶段(commit)。当transaction manager确认所有参与者都ready)后,向所有参与者发送commit命令。

XA规范在上世纪90年代初就被提出。目前,几乎所有主流的数据库都对XA规范提供了支持。

2、Java分布式事务的解决方案JTA(Java Transaction API)

定义了Java的XA接口,由具体的厂商提供实现,J2EE容器(WebLogic、JBoss)是JTA接口的实现者。

JTA的缺点:

  • 同步阻塞,并发效率差,准备阶段的成本持久,全局事务状态的成本持久。
  • 分布式架构存在瓶颈,单点的协调者(J2EE容器)会成为系统的瓶颈,需要建立协调者的集群来解决。
  • 数据源的类型受限,基本都是MySQL、Oracle类型的关系型数据库。

优点:开发代价小,程序不需要有太多的变化。

在这里插入图片描述

在这里插入图片描述

二、Seata XA模式

http://seata.io/zh-cn/index.html

在Seata定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对XA协议的支持,以XA协议的机制来管理分支事务的一种事务模式。

XA模式需要事务资源(数据库、消息服务等)支持XA协议,比如mysql把redolog分为两个阶段。

1、执行阶段

RM一阶段的工作,XA start/XA end/XA prepare+SQL+注册分支

  • 注册分支事务到TC

    • XA Start,Seata全局事务的XID和Branchld关联起来,以便由TC 驱动 XA 分支的提交或回滚
  • 执行分支事务但不提交

    • 业务SQL操作放在XA分支中进行,由资源对XA协议的支持来保证可回滚
    • XA分支完成后,执行XA prepare,同样,由资源对XA协议的支持来保证持久化(即,之后任何意外都不会造成无法回滚的情况)
  • 报告执行状态到TC

在这里插入图片描述

2、完成阶段

  • TC二阶段的工作,TC检测各个分支事的执行状态,如果全部成功,通知所有M提交事务;如果有失败,通知所有RM回滚事务。
  • RM二阶段的工作,接收TC指令,提交或回滚事务
    • 分支提交:执行XA分支的commit
    • 分支回滚:执行分支的rollback

3、XA模式的优缺点

(1)优点

  • 事务的强一致性,,满足ACID原则
  • 常用的数据都支持,实现简单,没有代码入侵

(2)缺点

  • 一阶段要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

4、XA模式的思考

XA模式下默认的事务的超时时间为60000毫秒,分支事务超时后会进行全局回滚。

但是如果协调者宕机,那么其中已经准备但未提交事务的所有参与者都会被阻塞。被阻塞的根本是

例如在读已提交隔离级别上,数据库事务通常会获取到待修改行数据的行级排他锁来防止脏写。在分布式事务提交或中止前,参与者数据库在能释放这些锁,因此协调者宕机多久,这些锁就要持有多久(在没有人为干预的情况
下)。这些锁被持有的期间,导致其他事务不能修改这些数据(根据数据库的不同,读取操作也可能被阻塞),所以这些数据相关的业务都会被阻塞,导致应用大面积的不可用,直至存疑事务被解决(提交/中止)。

理论上,如果协调者崩溃并重新启动,它应该从日志中恢复事务的状态,并解决现存的疑虑事务,但是在实际生产中,仍然会有疑虑事务的出现(可能是事务日志被破坏)。

也许你可能会考虑将相关应用的数据库服务器重启,但是在2PC正确的实现中,为了原子性的保证,重启后也必须持有存疑事务的锁。那么这样唯一的解决方案是让管理员手动提交还是回滚事务。

所以,协调者的高可用是需要我们考虑的问题。

Seata分布式事务AT模式

一、AT模式介绍

Seata AT模式同样是分阶段提交的事务模型,弥补了XA模式资源锁定周期过长的缺陷。缺点就是数据不是强一致性,因为它的数据会真实的提交到数据库的,而如果后面做分支事务有问题的话,回滚靠的是日志来实现最终一致。AT模式,是seatal的默认模式。

1、AT摸式的原理

第一阶段RM的工作:

  • 首先注册分支事务到事务协调者TC中
  • 记录一个SQL更新前的快照到undo_log日志表中
  • 执行SQL并提交数据库事务
  • 记录更新后的快照到undo_log日志表中
  • 报告事务状态

在这里插入图片描述

第二阶段RM的工作:

  • 如果此时所有微服务都执行完,并且没有出现异常情况,事务协调者TC通知RM删除udo-log记录

在这里插入图片描述

  • 如果此时中途有微服务出现异常情况,则TC会通知RM根据udo-log记录的对应快照恢复数据到更新前

在这里插入图片描述

2、执行流程

在这里插入图片描述

二、AT模式的开发

1、修改配置,准备undo_log表

AT模式只需要将配置中的data-source-proxy-mode:XA改为AT,或者是直接去除这一行配置即可。

AT模式会使用到几个数据库表:

  • 重做日志表:undo_log, 在每个业务数据库中都要创建
-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`id` bigint(0) NOT NULL AUTO_INCREMENT,`branch_id` bigint(0) NOT NULL,`xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(0) NOT NULL,`log_created` datetime(0) NOT NULL,`log_modified` datetime(0) NOT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

在这里插入图片描述

  • 分支事务表:branch table,在seata的数据库中创建
  • 全局事务表:global_table,在seatal的数据库中创建
  • 全局锁表:lock table,在seata的数据库中创建

全局事务表跟分支事务表是一对多的关系,一个全局事务对应多个分支事务。

2、AT模式与XA模式

(1)Seata AT模式是两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

(2)AT模式与XA模式的区别

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚:AT模式利用数据快照实现数据回滚。
  • XA是强一致性;AT是最终一致性。

Seata分布式事务TCC模式

一、TCC模式介绍

Tcc是分布式事务中二阶段提交协议的实现,它的全称为Tny-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),具体含义如下:

  • Try(prepare)阶段:对业务资源的检查并预留。
  • Confirm(commit)阶段:对y业务处理进行提交,该步骤会对Ty预留的资源进行释放,只要Try成功,Confirm-一定要能成功.
  • Cancel(rollback)阶段:对业务处理进行取消,即回滚操作。

Seata的TCC模式,整体是两阶段提交的模型。全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即需要每个分支事务都具备自己的:一阶段prepare、二阶段commit或rollback.

在这里插入图片描述

具体的执行流程如下:

在这里插入图片描述

根据两阶段行为模式的不同,我们将分支事务划分为Automatic(Branch)Transaction Mode和TCC(Branch) Transaction Mode.

AT模式基于支持本地ACID事务关系型数据库

  • 一阶段prepare行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。
  • 二阶段commit行为:马上成功结束,自动异步批量清理回滚日志。
  • 二阶段rollback行为:通过回滚日志,自动生成补偿操作,完成数据回滚。

相应的,TCC模式,不依赖于底层数据资源的事务支持:

  • 一阶段prepare行为:调用自定义的prepare逻辑。
  • 二阶段commit行为:调用自定义的commit逻辑。
  • 二阶段rollback行为:调用自定义的rollback逻辑。

所谓TCC模式,是指支持把自定义的分支事务纳入到全局事务的管理中。

二、案例分析

我们以订单支付为例,TCC模式下,我们需要手动编码实现事务处理,在try阶段尝试预留资源,在commit阶段,再把try阶段预留的资源转入最终表。因此我们需要在业务数据库表中增加预留字段

原始数据

在这里插入图片描述

1、Try阶段

try阶段对资源进行预处理
扣减余额:对余额进行扣减,及冻结余额
扣减库存:对库存进行扣减,增加冻结库存
更新订单:订单状态为支付中

在这里插入图片描述

2、Confirm阶段

confirm阶段业务执行提交,释放预留资源。
扣减余额:解除冻结余额
扣减库存:解除冻结库存
更新订单:修改订单状态为支付成功

在这里插入图片描述

3、Cancel阶段

TCC是一种侵入式的分布式事务解决方案,每个阶段都是独立的事务,与AT模式不同的是需要我们手动编码来实现数据恢复。

在这里插入图片描述

TCC是一种侵入式的分布式事务解决方案,每个阶段都是独立的事务,与T模式不同的是需要我们手动编码来实现数据恢复。

对业务系统有着非常大的入侵性,设计相对复杂,对比AT,它的优点是TCC完全不依赖数据库,并且因为数据回滚问题都是在业务层面解决的,所以不需要使用全局锁,故执行速度更快。

结合代码对比AT模式和XA模式

开启全局事务AT模式

1.超时导致的回滚+日志分析

在这里插入图片描述

断点运行查看相关的undo log日志

在这里插入图片描述

查看这条日志啥

select CAST(rollback_info as char)rollback_info,branch_id,xid,context,
log_status from storage_db.undo_log

在这里插入图片描述

由于我查询这条SQL语句耗费了时间,超时后数据回滚

在这里插入图片描述

库存微服务两阶段回滚

在这里插入图片描述

2.账户余额不足导致回滚

在这里插入图片描述

账户抛出异常

在这里插入图片描述

订单数据回滚

在这里插入图片描述

库存数据两阶段回滚

在这里插入图片描述

如果未开启全局事务

如果没有开启全局事务,只是用transactional注解

在这里插入图片描述

库存扣减,数据提交

在这里插入图片描述

账户抛出异常,未执行SQL

在这里插入图片描述

执行后数据的对比,订单数据回滚,库存抛异常,未执行SQL,库存扣减成功,数据出现不一致的情况

在这里插入图片描述

执行期间操作对比

(1)Seata AT模式是两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

(2)AT模式与XA模式的区别

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚:AT模式利用数据快照实现数据回滚。
  • XA是强一致性;AT是最终一致性。

AT模式

设置一下睡眠时间,让seata一直占用资源

在这里插入图片描述

执行SQL语句,修改成功

在这里插入图片描述

AT模式一阶段直接提交,不锁定资源。

在这里插入图片描述

XA模式

如果改成XA模式,XA模式一阶段不提交事务,锁定资源

在这里插入图片描述

锁定资源,一直等到seata执行完毕才能执行

在这里插入图片描述

附录:

1、账户account的SQL

/*Navicat Premium Data TransferSource Server         : 192.168.111.130_BookMallSource Server Type    : MySQLSource Server Version : 80033Source Host           : 192.168.150.101:3306Source Schema         : account_dbTarget Server Type    : MySQLTarget Server Version : 80033File Encoding         : 65001Date: 26/10/2023 10:42:19
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for account_tbl
-- ----------------------------
DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl`  (`id` int NOT NULL AUTO_INCREMENT,`user_id` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`money` int NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of account_tbl
-- ----------------------------
INSERT INTO `account_tbl` VALUES (1, '1', 50);-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`id` bigint NOT NULL AUTO_INCREMENT,`branch_id` bigint NOT NULL,`xid` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`context` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

2、订单Order的SQL

/*Navicat Premium Data TransferSource Server         : 192.168.111.130_BookMallSource Server Type    : MySQLSource Server Version : 80033Source Host           : 192.168.150.101:3306Source Schema         : order_dbTarget Server Type    : MySQLTarget Server Version : 80033File Encoding         : 65001Date: 26/10/2023 10:44:06
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for order_tbl
-- ----------------------------
DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl`  (`id` int NOT NULL AUTO_INCREMENT,`user_id` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`commodity_code` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`count` int NULL DEFAULT 0,`money` int NULL DEFAULT 0,`status` int NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of order_tbl
-- ----------------------------
INSERT INTO `order_tbl` VALUES (1, '1', '1001', 1, 100, 0);-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`id` bigint NOT NULL AUTO_INCREMENT,`branch_id` bigint NOT NULL,`xid` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`context` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

3、库存Storage的SQL

/*Navicat Premium Data TransferSource Server         : 192.168.111.130_BookMallSource Server Type    : MySQLSource Server Version : 80033Source Host           : 192.168.150.101:3306Source Schema         : storage_dbTarget Server Type    : MySQLTarget Server Version : 80033File Encoding         : 65001Date: 26/10/2023 10:45:46
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for stock_tbl
-- ----------------------------
DROP TABLE IF EXISTS `stock_tbl`;
CREATE TABLE `stock_tbl`  (`id` int NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`count` int NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `commodity_code`(`commodity_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of stock_tbl
-- ----------------------------
INSERT INTO `stock_tbl` VALUES (1, '1001', 10);-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`id` bigint NOT NULL AUTO_INCREMENT,`branch_id` bigint NOT NULL,`xid` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`context` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

总结

1、XA规范使用两阶段提交(2PC,Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务。

  • 第一阶段为准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。
  • 第二阶段为提交阶段(commit)。当transaction manager确认所有参与者都ready)后,向所有参与者发送commit命令。

2、AT模式与XA模式

(1)Seata AT模式是两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

(2)AT模式与XA模式的区别

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚:AT模式利用数据快照实现数据回滚。
  • XA是强一致性;AT是最终一致性。

3、Tny-Confirm-Cancel,TCC模式

TCC是分布式事务中二阶段提交协议的实现,它的全称为Tny-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),具体含义如下:

  • Try(prepare)阶段:对业务资源的检查并预留。
  • Confirm(commit)阶段:对y业务处理进行提交,该步骤会对Ty预留的资源进行释放,只要Try成功,Confirm-一定要能成功.
  • Cancel(rollback)阶段:对业务处理进行取消,即回滚操作。

相关文章:

分布式事务(Seata)——Seata分布式事务XA模式、AT模式、TCC模式的介绍和对比 结合案例分析AT模式和XA模式【源码】

前言 事务(TRANSACTION)是一个不可分割的逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交,要么都执行、要么都不执行。 事务作为系统中必须考虑的问题,无论是在单体项目还是在分布式项目中都需要进行…...

GMT 格式 转 标准日期格式

需求:有一个时间格式:TUE NOV 14 08:00:00 GMT08:00 2000 我需要将这种格式的时间转换为标准日期格式,并且只修改这种时间格式的时间,不影响其他的 思路:我想到的是用正则来判断,SimpleDateFormat来进行转换…...

【蓝桥杯选拔赛真题01】C++参赛建议 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++参赛建议 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <...

小红书为什么流量不好,小红书笔记质量评判标准有哪些?

我们都知道小红书平台强大的种草力与传播力&#xff0c;需要依靠优质笔记的输出来达成。但是很多时候&#xff0c;我们撰写了笔记&#xff0c;却无法被收录&#xff0c;获得流量&#xff0c;这都是因为笔记质量出现了问题。那么小红书为什么流量不好&#xff0c;小红书笔记质量…...

优化改进 | YOLOv2算法超详细解析(包括诞生背景+论文解析+技术原理等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv2是YOLO&#xff08;You Only Look Once&#xff09;目标检测算法的第二个版本&#xff0c;它在YOLOv1的基础上做了很多改进&#xff0c;包括使用更深的卷积神经网络Darknet-19作为特征提取器、使用Batch Normalizati…...

作为前端开发,你应该知道的这十几个在线免费工具

​偶然刷到知乎一位前端大佬 表歌 多篇优秀实用的文章&#xff0c;真的发现宝藏了 以下内容就是他在知乎分享的十几个在线免费工具 1. 页面设计检查清单&#xff1a;https://www.checklist.design/ 页面设计检查清单 通过清单可以检查一些常用容易忽略的设计要素。 2. 背景色…...

【广州华锐互动】关于物理力学的3D实验实操平台

在科学的广阔领域中&#xff0c;物理力学是一个至关重要的分支&#xff0c;它探索了物体在力作用下的运动规律。然而&#xff0c;传统的物理实验往往需要复杂的设备和大量的操作&#xff0c;这对于学生来说是一项巨大的挑战。为了解决这个问题&#xff0c;广州华锐互动开发了物…...

LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux内核的高可用性负载均衡软件。它通过将客户端请求分发到多个后端真实服务器&#xff0c;提高系统性能和可靠性。LVS支持多种调度算法&#xff0c;如轮询、最少连接、源地址哈希等&#xff0c;用于决定…...

Vue响应式数据的实现原理(手写副作用函数的存储和执行过程)

1.命令式和声明式框架 命令式框架关注过程 声明式框架关注结果&#xff08;底层对命令式的DOM获取和修改进行了封装&#xff09; 2.vue2 Object.defineProperty()双向绑定的实现 <body><div id"app"><input type"text" /><h1>…...

内核进程的调度与进程切换

进程被创建到了链表中&#xff0c;如何再进行进一步的调用和调用&#xff1f; 进程调度 void schedule(void)&#xff1b; 进程调度 switch_to(next); 进程切换函数 void schedule(void) {int i,next,c;struct task_struct ** p;/* check alarm, wake up any i…...

docker-rabbitmq 安装依赖

出现的问题如下: channel error; protocol method: #method(reply-code404, reply-textNOT_FOUND - no channel error&#xff1b; protocol method: #method&#xff1c;channel.close&#xff1e;(reply-code404, reply-textNOT_FOUND - no 查看rabbitmq 客户端是否存在如…...

(1)(1.9) HC-SR04声纳

文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 HC-SR04 声纳是一种价格低廉但量程很短&#xff08;最远只有 2m&#xff09;的测距仪&#xff0c;主要设计用于室内&#xff0c;但也成功地在室外的 Copter 上使用过。极短的测距范围使其用途有限。 &#xff01;Warning…...

06 MIT线性代数-列空间和零空间 Column space Nullspace

1. Vector space Vector space requirements vw and c v are in the space, all combs c v d w are in the space 但是“子空间”和“子集”的概念有区别&#xff0c;所有元素都在原空间之内就可称之为子集&#xff0c;但是要满足对线性运算封闭的子集才能成为子空间 中 2 …...

【每日一题Day360】LC1465切割后面积最大的蛋糕 | 贪心

切割后面积最大的蛋糕【LC1465】 矩形蛋糕的高度为 h 且宽度为 w&#xff0c;给你两个整数数组 horizontalCuts 和 verticalCuts&#xff0c;其中&#xff1a; horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口…...

中国地名信息库

地名是社会基本公共信息&#xff0c;是历史文化的重要载体。 2014年至2018年&#xff0c;国家启动实施并完成了第二次全国地名普查工作&#xff0c;全国共计采集地名1320多万条&#xff0c;修测标绘地名图2.4万多幅&#xff0c;新设更新地名标志68万多块&#xff0c;普遍建立了…...

网络时代下的声音之路:如何在中央新闻媒体发布网评稿

在当今数字时代&#xff0c;信息传播已经变得更加便捷和广泛。各大中央新闻媒体平台为民众提供了一个发布观点、表达意见的平台。在这个背景下&#xff0c;撰写并发布网评稿成为了一种重要的社会参与方式。根据媒介易软文发稿平台的总结&#xff0c;下面是探讨如何在各大中央新…...

Selenium中WebDriver最新Chrome驱动安装教程

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…...

云原生Docker数据管理

目录 Docker的数据管理 数据卷 数据卷容器 容器互联 容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;数据卷容器&#xff08;Data Volume Dontainers&#xff09; Docker的数据管理 数据卷 数据卷是一个供容器使用的特殊目录&a…...

endnote设置

问题1&#xff1a;参考文献的tab太长 首先要在endnote里面这样设置&#xff0c;file->output->edit "XXX" 保存之后&#xff0c;在word更新目录。 在word里面设置悬挂缩进 结果&#xff1a; Endnote参考编号与参考文献距离太远怎么调整 endnote 文献对齐方式…...

计算机网络整理-简称缩写【期末复习|考研复习】

文章目录 前言一、物理层1.1 FDM频分复用 Frequency-division multiplexing1.2 TDM时分复用 Time-division multiplexing1.3 WDM波分复用 Wavelength Division Multiplexing1.4 Hub 集线器1.5 FSK频移键控 Frequency-shift keying 二、数据链路层2.1 GBN回退N步协议 Go Back N …...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...