分布式事务 - 个人笔记 @by_TWJ

目录

  • 1. 传统事务
    • 1.1. 事务特征
    • 1.2. 事务隔离级别
      • 1.2.1. 表格展示
      • 1.2.2. oracle和mysql可支持的事务隔离级别
  • 2. 分布式事务
    • 2.1. CAP指标
    • 2.2. BASE理论
    • 2.3. 7种常见的分布式事务方案
      • 2.3.1. 2PC
      • 2.3.2. 3PC
      • 2.3.3. TCC
        • 2.3.3.1. TCC的注意事项:
        • 2.3.3.2. TCC方案的优缺点:
      • 2.3.4. SAGA(略,详细请看文章)
      • 2.3.5. 本地事务表(略,详细请看文章)
      • 2.3.6. MQ事务消息(略,详细请看文章)
      • 2.3.7. 最大努力通知(略,详细请看文章)
  • 3. 分布式事务实现框架
    • 3.1. 分布式事务Seata
      • 3.1.1. Seata事务管理中有三个重要的角色:
      • 3.1.2. Seata提供了四种不同的分布式事务解决方案:
        • 3.1.2.1. XA模式
        • 3.1.2.2. AT模式
        • 3.1.2.3. TCC模式
          • 3.1.2.3.1. 实现
          • 3.1.2.3.2. 版本v1.5.1之前存在一些问题:
            • 3.1.2.3.2.1. 空回滚、幂等、悬挂
        • 3.1.2.4. SAGA模式
        • 3.1.2.5. 总结
        • 3.1.2.6. 注意
      • 3.1.3. 项目例子

分布式事务 - 个人笔记

1. 传统事务

1.1. 事务特征

事务拥有以下四个特性,习惯上被称为 ACID 特性:

  1. 原子性(Atomicity)
    • 定义: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
    • 意思:事务是最小的工作单元,不可再分。
  2. 一致性(Consistency)
    • 定义:事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态是指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能被观察到(这层语义也有说应该属于原子性)。
    • 意思:事务必须保证多条DML语句同时成功或者同时失败。
  3. 隔离性(Isolation)
    • 定义:多个事务并发执行时,一个事务的执行不应影响其他事务的执行,如同只有这一个操作在被数据库所执行一样。
    • 意思:事务A与事务B之间具有隔离。
  4. 持久性(Durability)
    • 定义:已被提交的事务对数据库的修改应该永久保存在数据库中。在事务结束时,此操作将不可逆转。
    • 意思:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

1.2. 事务隔离级别

事务隔离性隔离级别,理论上隔离级别包括4个:

  • RU(READ-UNCOMMITTED 表示读未提交)

    • 可以读取到事务未提交的数据,隔离性差,会出现脏读(当前内存读),不可重复读,幻读问题;
  • RC(READ-COMMITTED 表示读已提交)

    • 可以读取到事务已提交的数据,隔离性一般,不会出现脏读问题,但是会出现不可重复读,幻读问题;
  • RR(REPEATABLE-READ 表示可重复读)

    • 可以防止脏读(当前内存读),防止不可重复读问题,防止会出现的幻读问题,但是并发能力较差;
    • 会使用next lock锁进制,来防止幻读问题,但是引入锁进制后,锁的代价会比较高,比较耗费CPU资源,占用系统性能;
  • SR(SERIALIZABLE 可串行化)

    • 隔离性比较高,可以实现串行化读取数据,但是事务的并发度就没有了;
    • 这是事务的最高级别,在每条读的数据上,加上锁,使之不可能相互冲突。

1.2.1. 表格展示

事务隔离级别脏读幻读不可重复读隔离性并发度能力
读未提交×××极差极好
读已提交××
可重复读
可串行化极高极差

× 表示没有解决
√ 表示已解决

例如:
读已提交,解决了脏读问题,但幻读和不可重复读,没有解决。

1.2.2. oracle和mysql可支持的事务隔离级别

Oracle数据库默认的隔离级别是读已提交

oracle 支持的事务隔离级别有

  1. READ COMMITTED (读已提交)
  2. SERIALIZABLE (可串行化)
  3. READ ONLY (只读)

MySQL数据库默认的隔离级是可重复读

MySQL 支持的事务隔离级别有

  1. READ UNCOMMITTED(未提交读)
  2. READ COMMITTED(提交读)
  3. REPEATABLE READ(可重复读)
  4. SERIALIZABLE(可串行化)

2. 分布式事务

2.1. CAP指标

首先,分布式事务是基于分布式系统的,所以先看如下分布式系统存在的一些问题。

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标

  • Consistency(一致性)
  • Availability (可用性)
  • Partition tolerance (分区容错性)

EricBrewer 说,分布式系统无法同时满足这三个指标。
这个结论就叫做 CAP 定理

在这里插入图片描述

满足两个指标,我们分别叫:

  • CP:满足“分区容错性”和“一致性”
  • AP:满足“可用性”和“分区容错性”
  • CA:满足“一致性”和“可用性”

具体解释

  • 一致性:指的是在分布式系统中,所有节点访问同一数据项时,看到的是相同的数据。一致性要求在任意时刻,所有节点中的数据是一样的。
  • 可用性:指的是在分布式系统中,客户端的请求能够在合理的时间内得到响应。
  • 分区容错性:指的是分布式系统能够容忍网络分区的情况,即系统中的某些节点之间由于网络故障而无法通信。

分布式事务
P是必须的,一定会存在网络方面的问题。
对于一个分布式系统来说,P 是一个基本要求,CAP 三者中,只能根据系统要求在 C 和 A 两者之间做权衡,并且要想尽办法提升 P

2.2. BASE理论

BASE理论是对CAP的一种解决思路,包含三个思想:

  • Basically Available (基本可用): 分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
  • soft state(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态
  • Eventually Consistent (最终一致性): 虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

2.3. 7种常见的分布式事务方案

2.3.1. 2PC

在这里插入图片描述

为了解决分布式一致性问题,人们提出了很多解决方案,其中比较重要的就是2PC和3PC。2PC其实就是相当于在后厨引入一个协调者,他负责统筹所有参与者。

二阶段提交的算法思路是在分布式系统中引入了协调者,参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

那么整个操作被分为两个阶段:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)

但是,同时,2PC也存在一些缺点,如同步阻塞问题、单点故障问题、无法100%保证数据一致性等问题。所以人们在2PC的基础上提出了3PC算法。

缺点:2PC的缺点也很致命:同步阻塞,单点问题,数据不一致,太过保守

  • 1、同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态,各个参与者在等待协调者发出提交或中断请求时,会一直阻塞,而协调者的发出时间要依赖于所有参与者的响应时间,如果协调者宕机了(单点),那么他就一直阻塞在这,而且无法达成一致(3PC引入了超时提交解决)。
  • 2、单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
  • 3、数据不一致。出现分区,或者网络故障。在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。
  • 4、太过保守:2pc没有设计相应的容错机制,例如:当任意一个参与者节点宕机,那么协调者超时没收到响应,就会导致整个事务回滚失败。
  • 5、二阶段无法解决的问题:协调者(在第二阶段)发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

由于二阶段提交存在着诸如同步阻塞、单点问题、脑裂等缺陷,所以,研究者们在二阶段提交的基础上做了改进,提出了三阶段提交。

2.3.2. 3PC

在这里插入图片描述

3PC,三阶段提交协议,是二阶段提交协议的改进版本,三阶段提交有几个改动点:

  • (1)在参与者中都引入超时机制,解决的单点故障问题,并减少阻塞
  • (2)在2PC基础上,3PC把2PC的第一阶段,拆分成两个阶段,增加了CanCommit阶段。减少不能执行的事务,进入被锁阶段。

tips: 2pc只有协调者有超时机制,超时后,回滚。

所以3PC会分为3个阶段,CanCommit 准备阶段、PreCommit 预提交阶段、DoCommit 提交阶段

注意:3PC无法解决:数据不一致以及太过保守问题

数据不一致问题依然存在,当在参与者收到 preCommit 请求后等待 doCommit 指令时,此时如果协调者请求中断事务,而协调者因为网络问题无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。

2.3.3. TCC

在这里插入图片描述

TCC(Try Confirm Cancel)是应用层的两阶段提交,所以对代码的侵入性强,其核心思想是:针对每个操作,都要实现对应的确认和补偿操作,也就是业务逻辑的每个分支都需要实现 try、confirm、cancel 三个操作,第一阶段由业务代码编排来调用Try接口进行资源预留,当所有参与者的 Try 接口都成功了,事务协调者提交事务,并调用参与者的 confirm 接口真正提交业务操作,否则调用每个参与者的 cancel 接口回滚事务,并且由于 confirm 或者 cancel 有可能会重试,因此对应的部分需要支持幂等。

2.3.3.1. TCC的注意事项:
  • (1)允许空回滚

问题:空回滚出现的原因是 Try 超时或者丢包,导致 TCC 分布式事务二阶段的 回滚,触发 Cancel 操作,此时事务参与者未收到Try,但是却收到了Cancel 请求。(简略:cansel比try更快来到,cansel需要处理try为空的情况
解决办法:在cansel阶段,查询是否有冻结记录,如果没有,则创建一个不需要补偿的记录,例如:冻结金额为0

  • (2)防悬挂控制

问题:悬挂指的是二阶段的 Cancel 比 一阶段的Try 操作先执行,出现该问题的原因是 Try 由于网络拥堵而超时,导致事务管理器生成回滚,触发 Cancel 接口,但之后拥堵在网络的 Try 操作又被资源管理器收到了,但是 Cancel 比 Try 先到。但按照前面允许空回滚的逻辑,回滚会返回成功,事务管理器认为事务已回滚成功,所以此时应该拒绝执行空回滚之后到来的 Try 操作,否则会产生数据不一致。因此我们可以在 Cancel 空回滚返回成功之前,先记录该条事务 xid 或业务主键,标识这条记录已经回滚过,Try 接口执行前先检查这条事务xid或业务主键是否已经标记为回滚成功,如果是则不执行 Try 的业务操作。(简略:cansel比try更快来到,try需要处理,cansel已经创建了空try问题
解决办法:在try阶段,查询是否有冻结记录,如果有,则跳过直接返回结果。

  • (3)幂等控制

问题:由于网络原因或者重试操作都有可能导致 Try - Confirm - Cancel 3个操作的重复执行,所以使用 TCC 时需要注意这三个操作的幂等控制,通常我们可以使用事务 xid 或业务主键判重来控制。(简略:Try - Confirm - Cancel 3个操作的重复执行的问题
解决办法:在冻结记录表,增加状态字段,记录 Try - Confirm - Cancel 3个操作状态,执行Try - Confirm - Cancel操作时,先查看当前事务在哪个阶段。

具体解决办法:

  • 因为try阶段,防悬挂控制已经解决了try阶段的重复try问题。
  • comfirm阶段,我们已经把冻结记录删了,所以重复删除,不会影响功能。
  • cansel阶段,我们要判断是否重复取消执行,如果是,则直接返回结果。(真正要写代码的)
2.3.3.2. TCC方案的优缺点:

(1)TCC 事务机制相比于上面介绍的 XA 事务机制,有以下优点:

性能提升:具体业务来实现,控制资源锁的粒度变小,不会锁定整个资源。
数据最终一致性:基于 Confirm 和 Cancel 的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。
可靠性:解决了 XA 协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群。

(2)缺点:TCC 的 Try、Confirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。

2.3.4. SAGA(略,详细请看文章)

2.3.5. 本地事务表(略,详细请看文章)

2.3.6. MQ事务消息(略,详细请看文章)

2.3.7. 最大努力通知(略,详细请看文章)

参考文章:七种常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)

3. 分布式事务实现框架

3.1. 分布式事务Seata

seata官网:https://seata.apache.org/zh-cn/docs/user/quickstart/

3.1.1. Seata事务管理中有三个重要的角色:

  • TC(Transaction Coordinator)-事务协调者: 维护全局和分支事务的状态协调全局事务提交或回滚
  • TM(Transaction Manager)-事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务
  • RM(Resource Manager)-资源管理器: 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状
    态,并驱动分支事务提交或回滚。

字面意思就是:

  • TC 事务协调者,即独立运行的seata-server,用于接收事务注册,提交和回滚
  • TM 事务发起者。用来告诉TC全局事务的开始,提交,回滚
  • RM 事务资源,每一个RM都会作为一个分支事务注册在TC。

在这里插入图片描述

在这里插入图片描述

3.1.2. Seata提供了四种不同的分布式事务解决方案:

3.1.2.1. XA模式

XA模式是使用数据库本身所拥有的事务

多事务操作的方式,如下:
在这里插入图片描述

3.1.2.2. AT模式

AT模式是利用额外的表(undo_log、lock_table)存储原始的数据,若业务回滚,则恢复原始的数据。

多事务操作的方式,如下:
在这里插入图片描述
AT是利用全局锁的方式,最终使用的是行锁。

-- auto-generated definition
create table lock_table
(row_key        varchar(128)      not nullprimary key,xid            varchar(128)      null,transaction_id bigint            null,branch_id      bigint            not null,resource_id    varchar(256)      null,table_name     varchar(32)       null,pk             varchar(36)       null,status         tinyint default 0 not null comment '0:locked ,1:rollbacking',gmt_create     datetime          null,gmt_modified   datetime          null
)charset = utf8mb4;create index idx_branch_idon lock_table (branch_id);create index idx_statuson lock_table (status);create index idx_xidon lock_table (xid);-- auto-generated definition
create table undo_log
(branch_id     bigint       not null comment 'branch transaction id',xid           varchar(128) not null comment 'global transaction id',context       varchar(128) not null comment 'undo_log context,such as serialization',rollback_info longblob     not null comment 'rollback info',log_status    int          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',constraint ux_undo_logunique (xid, branch_id)
)comment 'AT transaction mode undo table' charset = utf8mb4;create index ix_log_createdon undo_log (log_created);
3.1.2.3. TCC模式

缺点:
TCC 是一种侵入式的分布式事务解决方案,需要业务系统自行实现 Try,Confirm,Cancel 三个操作,对业务系统有着非常大的入侵性,设计相对复杂。

优势:
TCC 完全不依赖底层数据库,能够实现跨数据库、跨应用资源管理,可以提供给业务方更细粒度的控制。

3.1.2.3.1. 实现

需要创建冻结数据表

-- auto-generated definition
create table account_freeze_tbl
(xid      varchar(255)  primary key,user_id varchar(255)  null,freeze_money   int default 0 null,status  int default 0 null
)charset = utf8mb3;-- auto-generated definition
create table order_freeze_tbl
(xid      varchar(255)  primary key,order_id varchar(255)  null,freeze_count   int default 0 null,freeze_money   int default 0 null,status  int default 0 null
)charset = utf8mb3;-- auto-generated definition
create table storage_freeze_tbl
(xid      varchar(255)  primary key,storage_id varchar(255)  null,freeze_count   int default 0 null,status  int default 0 null
)charset = utf8mb3;

seata v1.5.1 及之后,解决空回滚、幂等、悬挂,需要添加 useTCCFence = true,并且新增表 tcc_fence_Log。

@LocalTCC
public interface TccAccountService {@TwoPhaseBusinessAction(name = "account", commitMethod = "commit", rollbackMethod = "rollback",useTCCFence = true)String account(@BusinessActionContextParameter("userId") String userId,@BusinessActionContextParameter("money") int money,@BusinessActionContextParameter("type") int type) ;boolean commit(BusinessActionContext actionContext);boolean rollback(BusinessActionContext actionContext);
}

CREATE TABLE IF NOT EXISTS tcc_fence_Log
(xid VARCHAR(128) NOT NULL ,branch_id Bigint NOT NULL ,action_name VARCHAR(64) NOT NULL ,status TINYINT NOT NULL ,gmt_create DATETIME NOT NULL  ,gmt_modified DATETIME NOT NULL  ,PRIMARY KEY (xid,branch_id))
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;

TCC分支事务状态:包含四种:已尝试、已提交、已回滚、空悬挂

3.1.2.3.2. 版本v1.5.1之前存在一些问题:
3.1.2.3.2.1. 空回滚、幂等、悬挂

参考前面的TCC。

3.1.2.4. SAGA模式

seata saga:https://seata.apache.org/zh-cn/docs/dev/mode/saga-mode
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务(执行处理的时候出错了,给一个修复的机会)都由业务开发实现。

参考前面的SAGA

3.1.2.5. 总结
  • XA模式 - 强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
  • TCC模式 - 最终一致的分阶段事务模式,有业务侵入
  • AT模式 - 最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • SAGA模式 - 长事务模式,有业务侵入

tips:

  1. 无业务侵入 - 不用写代码
  2. 有业务侵入 - 要写代码
3.1.2.6. 注意

TCC 写代码注意点:

  1. try阶段,你可以通过RootContext.getXID() 获取xid,但在rollback阶段,你只能铜鼓businessActionContext.getXid() 获取xid
  2. seata 1.5.1 之后,已经完善了,空回滚、悬挂、幂等 问题,你不需要在配了
  3. 使用seata事务,本地事务需要开启的,都要开启 @GlobalTransactional

3.1.3. 项目例子

seata例子,只有XA、AT、TCC模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 Cisco虚拟局域网划分

一、实验内容 1、分别把交换机命名为SWA、SWB 2、划分虚拟局域网 valn ,并将端口静态划分到 vlan 中 划分vlan 方法一:在全局模式下划分vlan,在SWA交换机上创建三个vlan,分别为vlan2,vlan3,vlan4。 方…

OpenCV的查找命中或未命中

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9更多形态转换 下一篇:OpenCV系列文章目录(持续更新中......) 目标 在本教程中,您将学习如何使用 Hit-or-Miss 转换(也称为 Hit-and-Miss 转…

树莓派驱动开发--驱动文件代码的浅度分析(以iic的为例)

前言:我使用的代码是正点原子的驱动代码,我们借鉴学习,看多了别人优秀的代码是我们自主完成代码编写的前提! 一. 总体层面梳理 总线-驱动-设备 模型 --把不同功能的外设归类,然后实现统一接口,无法归类的使用虚拟总线来形容,从而实现总线-驱动-设备模型. --为什么要这样?比…

C/C++基础----指针

指针的定义 在c/c中,有一个特殊的变量指向我们电脑中某个内存地址,进而可以让我们操作这段内存,指的就是指针类型 语法: int a 10; int* p &a;&符号是取出某个变量的内存地址 把这个内存地址赋值给一个变量p&#xff…

Java代码基础算法练习-拆分一个三位数的个位、十位、百位-2024.04.14

任务描述:输入一个三位数,逆序输出这个三位数的个位、十位、百位对应的数字,用空格分开。 任务要求: 代码示例: package April_2024;import java.util.Scanner; public class a240414 {public static void main(Strin…

972: 统计利用先序遍历创建的二叉树的宽度

解法&#xff1a; #include<iostream> #include<queue> using namespace std; // 定义二叉树结点 struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) :val(x), left(NULL), right(NULL) {}; }; // 先序递归遍历建立二叉树 TreeNode* bu…

spark实验三-spark进阶编程

1&#xff0e;Spark编程统计各地区租房人数 实验目标&#xff1a; (1) 掌握在IntelliJ IDEA 中操作spark程序开发 (2) 打包程序提交集群运行 实验说明&#xff1a; 现有一份某省份各地区租房信息文件 house.txt&#xff0c;文件中共有8个数据字段&#xff0c;字段说明…

每日两题1

文章目录 使用最小花费爬楼梯91解码方法 使用最小花费爬楼梯 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size() 2)return min(cost[0],cost[1]);vector<int> dp;dp.reserve(cost.size()1);dp[0] 0;dp[1] 0;for(int i…

【域适应】基于深度域适应MMD损失的典型四分类任务实现

关于 MMD &#xff08;maximum mean discrepancy&#xff09;是用来衡量两组数据分布之间相似度的度量。一般地&#xff0c;如果两组数据分布相似&#xff0c;那么MMD 损失就相对较小&#xff0c;说明两组数据/特征处于相似的特征空间中。基于这个想法&#xff0c;对于源域和目…

顶切,半顶切是什么意思?

齿轮加工及刀具中有一些特定名词或者叫法&#xff0c;不熟悉的小伙伴可能最开始会有一些困惑&#xff0c;这不&#xff0c;最近有小伙伴问了一个问题&#xff1a;顶切是说齿顶的倒角吗&#xff1f; 今天就给大家说说顶切和半顶切。 一、顶切 Topping 从字面上可以看到可以想到…

MySQL的权限管理

MySQL的权限管理 在理解MySQL的权限管理之前&#xff0c;我们需要先了解其架构设计以及权限管理在该架构中的定位。 MySQL的架构设计 MySQL数据库系统采用了分层的架构设计&#xff0c;主要可以分为以下几个层级&#xff1a; 连接层&#xff1a;最外层&#xff0c;处理连接…

爬虫 selenium

爬虫 selenium 【一】介绍 【1】说明 Selenium是一款广泛应用于Web应用程序测试的自动化测试框架 它可以模拟用户再浏览器上的行为对Web应用进行自动化测试 主要作用&#xff1a; 浏览器控制&#xff1a;启动、切换、关闭不同浏览器元素定位于操作&#xff1a;通过CSS选择器…

vscode中运行js

vscode中运行js 目前vscode插件运行js都是基于node环境&#xff0c;vscode控制台打印有些数据不方便等缺点。 每次调试在浏览器中运行js&#xff0c;需要创建html模板、插入js。期望能够直接运行js可以打开浏览器运行js&#xff0c;在vscode插件市场找到一款插件可以做到。 插…

yolo系列(之一)

深度学习经典检测算法 two-stage (两阶段) : Faster-rcnn Mask-Rcnn系列 &#xff08;输入图像---》CNN特征---》预选框---》输出结果&#xff09; one-stage (单阶段): YOLO系列 &#xff08;输入图像---》CNN特征---》输出结果&#xff09; one-stage的特点&#xff1a;&…

深度学习学习日记4.15 (面向GPT学习)

精确学习时间&#xff08;09点35分开始&#xff09; 深度学习 torch.nntorch.utils.datanumpytorchvision中的模块有哪些os 模块PIL&#xff08;Python Imaging Library&#xff09;tqdmmatplotlibnn.ReLU inplace参数设为Truenn.relu 训练的迭代过程梯度清零loss指标计算为什…

SQLite超详细的编译时选项(十六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite数据库文件格式&#xff08;十五&#xff09; 下一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 1. 概述 对于大多数目的&#xff0c;SQLite可以使用默认的 编译选项。但是…

WinForms 零基础进阶教程:文件操作与 CSV 处理

文章目录 文件操作数据存储与文件操作文件存取的好处文件存取的方式文本文件的写入和读取文本文件的删除、复制和移动 目录的操作文件属性操作文件路径 对话框OpenFileDialog对话框SaveFileDialog对话框对话框中CheckPathExists属性的应用 CSV 文件读写与 DataGridView 进阶Dat…

Python基于Django的微博热搜、微博舆论可视化系统

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Redis限流插件

Redis限流插件: 1:搭建层级结构 同时对 redis.log 授权 chmod 777 redis.log2:确认 redis 版本 3:下载redis配置文件 redis.conf https://redis.io/docs/management/config/ 4:上传/redis/conf作为原始 redis.conf 5:在/redis_6390/conf下编辑redis.conf docker run -it \ --…

51单片机上面的IIC协议

1、什么是IIC协议 2、模拟IIC协议 51单片机上面是没有与IIC协议相关的寄存器的&#xff08;没有相关的硬件&#xff09;&#xff0c;不像串口可以配置对应的寄存器达到目的&#xff08;比如修改波特率9600 or 115200&#xff09;&#xff0c;要配置IIC只能够根据用户手册里面的…