分布式事务(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、输入输出 二、算法分析 <...

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

优化改进 | YOLOv2算法超详细解析(包括诞生背景+论文解析+技术原理等)
前言:Hello大家好,我是小哥谈。YOLOv2是YOLO(You Only Look Once)目标检测算法的第二个版本,它在YOLOv1的基础上做了很多改进,包括使用更深的卷积神经网络Darknet-19作为特征提取器、使用Batch Normalizati…...

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

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

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

Vue响应式数据的实现原理(手写副作用函数的存储和执行过程)
1.命令式和声明式框架 命令式框架关注过程 声明式框架关注结果(底层对命令式的DOM获取和修改进行了封装) 2.vue2 Object.defineProperty()双向绑定的实现 <body><div id"app"><input type"text" /><h1>…...

内核进程的调度与进程切换
进程被创建到了链表中,如何再进行进一步的调用和调用? 进程调度 void schedule(void); 进程调度 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; protocol method: #method<channel.close>(reply-code404, reply-textNOT_FOUND - no 查看rabbitmq 客户端是否存在如…...

(1)(1.9) HC-SR04声纳
文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 HC-SR04 声纳是一种价格低廉但量程很短(最远只有 2m)的测距仪,主要设计用于室内,但也成功地在室外的 Copter 上使用过。极短的测距范围使其用途有限。 !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 但是“子空间”和“子集”的概念有区别,所有元素都在原空间之内就可称之为子集,但是要满足对线性运算封闭的子集才能成为子空间 中 2 …...

【每日一题Day360】LC1465切割后面积最大的蛋糕 | 贪心
切割后面积最大的蛋糕【LC1465】 矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCuts 和 verticalCuts,其中: horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口…...

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

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

Selenium中WebDriver最新Chrome驱动安装教程
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…...

云原生Docker数据管理
目录 Docker的数据管理 数据卷 数据卷容器 容器互联 容器中管理数据主要有两种方式: 数据卷(Data Volumes)数据卷容器(Data Volume Dontainers) Docker的数据管理 数据卷 数据卷是一个供容器使用的特殊目录&a…...

endnote设置
问题1:参考文献的tab太长 首先要在endnote里面这样设置,file->output->edit "XXX" 保存之后,在word更新目录。 在word里面设置悬挂缩进 结果: 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 …...

Flink Hive Catalog操作案例
在此对Flink读写Hive表操作进行逐步记录,需要指出的是,其中操作Hive分区表和非分区表的DDL有所不同,以下分别记录。 基础环境 Hive-3.1.3 Flink-1.17.1 基本操作与准备 1、上传依赖jar包到flink/lib目录下 cp flink-sql-connector-hive-…...

NSSCTF做题第9页(3)
[GKCTF 2020]CheckIN 代码审计 这段代码定义了一个名为ClassName的类,并在脚本的最后创建了一个ClassName类的实例。 在ClassName类的构造函数中,首先通过调用$this->x()方法获取了请求参数$_REQUEST中的值,并将其赋值给$this->code属性…...

从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程【文末送书五本】
从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程 前言内容简介购买链接作者简介专家推荐读者对象参与方式往期赠书回 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新星创作者,CSDN实…...

设置使用LibreOffice作为默认程序打开word、excel等文档
以win7为例。打开控制面板,点击程序: 点击“设置默认程序”: 左侧选中LibreOffice,然后在右下方点击“选择此程序的默认值”: 然后根据自己的需要勾选就行了:...

创新领航 | 竹云参编《基于区块链的数据资产评估实施指南》正式发布!
10月25日,由深圳数宝数据服务股份有限公司和深圳职业技术大学提出,中国科学院深圳先进技术研究院、中国电子技术标准化研究院、中国(天津)自由贸易试验区政策与产业创新发展局、网络空间治理与数字经济法治(长三角&…...

【Docker】Linux网桥连接多个命名空间
veth实现了点对点的虚拟连接,可以通过veth连接两个namespace,如果我们需要将3个或者多个namespace接入同一个二层网络时,就不能只使用veth了。 在物理网络中,如果需要连接多个主机,我们会使用bridge(网桥&…...

ES6新特性:let关键字详解
文章目录 1 声明提升2 作用域3 重复声明 在JavaScript中,let 和 var 都是声明变量的关键字,但在用法和作用域方面有一些区别。 let 是ES6引入的新的声明变量的关键字,它与 var 相比,更加严格,语法更加规范,…...

鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]
文章目录 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术…...

使用pycharm远程连接到Linux服务器进行开发
预计达到的效果 本地的 PyCharm 能达到和远程服务器之间的文件同步;本地的 PyCharm 能够使用远程服务器的开发环境; 环境配置 PyCharm:PyCharm 2021.3 (Professional Edition)Linux服务器:Ubuntu20.04 步骤 1.进入配置项 配…...

JavaScript 中 BOM 基础知识有哪些?
浏览器对象模型(Browser Object Model,简称 BOM)是 JavaScript 的组成部分之一,BOM 赋予了 JavaScript 程序与浏览器交互的能力。 window 对象是 BOM 的核心,用来表示当前浏览器窗口,其中提供了一系列用来…...