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

【MySQL事务】深刻理解事务隔离以及MVCC

文章目录

  • 什么叫事务
  • 事务的提交方式
  • 常见的事务操作方式
    • 事务的开始与回滚
    • 总结
  • 事务的隔离
    • 设置隔离级别
    • 解释脏读
    • 解释幻读
    • 解释不可重复读
    • 为什么可重复读不能解决幻读问题?
    • 总结
  • 数据库并发的场景
    • MVCC
      • 隐藏列字段
      • undo日志
      • Read view
    • RR和RC的本质区别
      • 总结

什么叫事务

在MySQL中,事务(Transaction)是一组为达成某种目的的sql操作。事务可以是单条sql语句,也可以是多条语句的集合。例如银行的一次转账,主要包含两个sql操作:一是某某用户的资产减少,二是另一个用户的资产增加。将这两条sql语句打包起来就可以称之为一个简单的转账事务。对于用户而言,他并不需要关注事务的过程,他只关心这一件事务有没有完成。即使在底层事务有执行过程,但是在概念上我们认为事务就是原子性的,即忽略中间的执行过程

事务除了是sql操作的集合之外,还满足以下四个属性:

  • 原子性(Atomicity):一个事务中的所有操作必须要么全部完成,要么全部不完成,不会结束在中间的某个环节。即使在事务的执行过程中发生了某种错误,mysql也会回滚到事务开始前的状态。
  • 一致性(Consistency):一致性确保事务将数据库从一个一致状态转变为另一个一致状态。在事务开始和完成时,数据库必须遵守所有定义的规则,包括数据的完整性约束。
  • 隔离性( I solation):数据库允许多个并发事务同时对同一数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于sql交叉执行而导致数据不一致。具体来说,事务隔离又分为不同级别,包括:读未提交Read uncommitted)、读提交read committed )、可重复读 repeatable read )和串行化Serializable )。不同的隔离级别会影响并发控制的严格程度,隔离级别越低越危险,效率越高,隔离级别越高越安全,效率越低。不同的场景需要选择合适的隔离级别。mysql默认的隔离级别是可重复读
  • 持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

上面四个属性可以简称为AICD
值得注意的是,在MySQL中并不是所有存储引擎都支持事务,比如MyISAM就不支持,而Innodb是支持的。 这一点可以在mysql中使用sqlshow engines;查看
在这里插入图片描述

事务的提交方式

事务的提交方式常见的有两种:

  • 自动提交
  • 手动提交

可以使用sql查看事务提交方式如:
在这里插入图片描述
ON表示自动提交,OFF表示关闭自动提交,默认是ON
可以使用set来改变mysql的自动提交模式,0表示关闭,1表示打开

在这里插入图片描述

常见的事务操作方式

下面用具体的sql样例来展示常见的事务操作,为了方便观察,以下事务操作是在读未提交的隔离级别下进行的,关于修改数据库的隔离级别操作后面会讲,目前不用在意。

现创建测试表

create table if not exists account(id int primary key, name varchar(50) not null default '', blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

上述sql初建了一个简单的银行用户表

事务的开始与回滚

  • begin表示开启一个事务
  • commit表示提交事务
  • savepoint 设置保存点,将来可以回滚到保存点之前
  • rollback 回滚操作,可以回滚到某一个保存点,如果一个事务被提交了则不能回退

在这里插入图片描述
在这里插入图片描述
我们可以看到在一个事务中,使用rollback可以将当前状态回滚到某一个保存点之前
如果直接在事务中使用rollback则表示回滚到事务的最开始,例如:

  • 值得注意的是,如果我们开启一个事物但是没有commit提交,发生异常中断后,MySQL会自动回滚
    在这里插入图片描述
    一旦我们conmmit提交了事务,之后发生中断mysql崩溃,数据也不会受到影响,此时数据已经持久化保存在数据库表文件中,这体现了事务的数据持久性。

  • begin操作会自动更改提交方式,不会受MySQL是否自动提交影响
    一旦开启事务,就必须要使用commit提交,即使我们设置了自动提交,在遇到异常时,一样会回滚。这一点在上面的实验中已经可以证明。

  • 自动提交只会影响单sql事务
    实验一:终端A关闭自动提交,执行一条单sql事务后发生中断,观察现象
    在这里插入图片描述

实验二:终端A打开自动提交,执行一条单sql事务后发生中断,观察其现象

在这里插入图片描述

总结

  • 只要使用begin或者start transaction开启事务,就必须要通过commit提交,否则即使设置了autocommit也不会自动提交。
  • 事务可以手动回滚,同时,当操作异常时,MySQL会自动回滚
  • 对于InnoDB每一条SQL语句都默认封装成一个事务,自动提交。(除select外)

事务的隔离

既然MySQL支持并发访问,那多个事务一起访问同一个数据库中同一张表的场景就会经常出现。不同事物之间可能会有sql交叉执行的情况。 例如一个事物执行updata另一个事务执行select,应该先执行谁呢? 为了避免多个事务相互影响,MySQL提供了一系列方案来维持事物并发时数据的一致性,这就叫做事务的隔离。当然,事务的隔离并不是完全将两个事务隔离开互不干扰,根据不同的场景,我们需要选择不同的隔离程度。隔离程度的不同也决定了隔离级别的不同。下面我们将谈谈事物的隔离级别有哪些:

  1. 读未提交(Read Uncommitted):该隔离级别下的事务可以看到其他事务没有提交的执行结果,相当于没有隔离,会产生许多并发问题,如脏读,幻读,不可重复读等(后面会讲解什么是脏读等)。
  2. 读提交(Read Committed):该隔离级别下,一个正在执行的事务能看到另一个已经提交的事务的执行结果,这种隔离级别不会导致脏读,但是不可重复读以及幻读
  3. 可重复读(Repeatable Read):MySQL默认的隔离级别。该隔离级别的事务看到的数据是一致的,不会受到其他事务的影响,即使其他事物提交了。InnoDB存储引擎默认使用这个隔离级别。注意该隔离级别依旧存在幻读问题。
  4. 串行化(Serializable):事物的最高隔离级别。通过强制对事物进行排序,使得每一个事物的开始必然是在另一个事物结束之后,也就不会有冲突问题,从而解决了幻读问题。它在每行数据上面加上共享锁。可能这种隔离级别的效率太低了。

下面解释什么是脏读、幻读、不可重复读。在此之前先介绍如何在MySQL中设置隔离级别。

设置隔离级别

  • 查看全局的隔离级别
    可以使用sqlselect transaction_isolation;(mysql8.0以前版本是tx_isolation
    在这里插入图片描述
  • 查看当前会话的隔离级
    使用sql select @@session.transaction_isolation;
    在这里插入图片描述

全局隔离级别是对整个MySQL服务器实例的默认设置,影响所有新创建的会话(连接)。当你设置全局隔离级别时,任何新的连接都会使用这个隔离级别,除非在会话中另行指定。当前会话隔离级别只影响当前连接的事务隔离级别,当你设置会话隔离级别时,该设置仅对当前连接有效,不会影响其他会话。会话隔离级别的优先级要高于全局隔离级别

  • 设置全局隔离级别
    以设置为RR级别(重复读)为例,使用sql set global transaction isolation level repeatable read;

在这里插入图片描述
值得注意的是,如果我们只修改全局隔离级别,那么需要重启更新会话隔离级别

  • 设置会话隔离级别
    set session transaction isolation level repeatable read;
    在这里插入图片描述

解释脏读

脏读是指一个事务能读取到另一个事务尚未提交的修改数据

例如:
事务A开始并更新了一行数据,但是未提交
事务B读取了事务A未提交的这行数据
事务A回滚了此次修改数据
此时事务B读到的就是无效数据
在这里插入图片描述
解决方法:将隔离级别设置为RC(读提交),或者更高。

解释幻读

幻读是指在一个事务中,两次查询到的数据结果集不一致,因为其他事务在两次查询之间插入或者删除了数据。注意幻读与脏读的区别,脏读主要是指读取到未提交的事务,且被回滚导致另一事务读取到的数据无效,它的问题在于数据不可靠。而幻读的问题在于查询结果不一致,结果集中出现新的行或消失的行,导致数据一致性问题。主要在RR及以下的隔离级别发生。

解释不可重复读

不可重复读是指在一个事务中,连续读取同一行数据时,因为其他事务的提交而导致结果不一致

例子:
事务A读取了一行数据。
事务B更新了这行数据并提交。
事务A再次读取同一行数据,发现数据已经发生了变化。

为什么可重复读不能解决幻读问题?

隔离性的实现是通过对数据加锁来实现的,而insert待插入的数据本来是不存在的,那么一般加锁无法屏蔽这类问题。MySQL在RR级别解决了幻读问题(其它数据库不一定),解决的方式是通过用next-key间隙锁(GAP+行锁)。

间隙锁(next-key locking):间隙锁是一种锁定策略,不仅锁定表中的行,也锁定行之间的间隙,防止其他事务在间隙中插入新的行,从而避免幻读。

间隙(GAP): 当我们使用范围查询时,InnoDB首先会给复合条件的行加锁,但是对于不在查询范围的行,我们就称为间隙。

例如:
假设有一张employees,其结构如下:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);

初始表数据如下:

idname
1Alice
3Bob
5Charlie

事务A执行以下查询:

START TRANSACTION;
SELECT * FROM employees WHERE id >= 3 AND id <= 5;

在这个查询中,InnoDB会使用间隙锁来锁定id为3和5的行,同时锁定以下间隙:

(-, 1)
(1, 3)
(3, 5)
(5, +)

所以当事务A未提交,但是事务B想在间隙中插入数据,由于间隙锁的存在,事务B就会被阻塞,直到事务A提交或者回滚。

总结

  • 隔离级别越高,安全性越高,并发性能越低
  • 不可重复读的重点在于修改,幻读的重点在于新增和删除
  • mysql的默认隔离级别是RR
    在这里插入图片描述

数据库并发的场景

数据库并发的场景有三种:

  • 读-读:不存在任何问题,也不需要并发控制
  • 读-写: 有线程安全问题,可能会造成事务隔离性问题如不可重复读、脏读、幻读等问题
  • 写-写:有线程安全问题,可能会导致数据更新丢失

下面主要讲读写并发。

MVCC

多版本并发控制Multi-Version Concurrency Control,MVCC)是一种用于提高数据库并发性能的机制。具体来说,MVCC机制通过维护数据的多个版本来实现,这些版本包含了不同事务在不同时间点的修改,为了区分不同事务,MVCC为事务提供了单向增长的事务ID。事务ID与版本相关联,读操作只读该事务开始前的数据库的快照。总的来说,MVCC机制规范了事务应该读到数据版本的范围,这也叫做事务的可见性。于是,通过控制事务的可见性范围,MVCC也就实现了无锁并发控制

  • 快照:快照是是数据库某一时刻的数据副本,记录了创建快照时数据库的状态。
  • 事务的可见性:当一个事务读取数据时,MVCC会根据事务ID的大小来决定哪个版本对该事务可见。(事务ID通常就是时间戳

综上,MVCC可以为数据库解决以下问题:

  • 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能。

    • 读取操作:事务在读取数据时,MVCC会查看数据的所有版本,并选择在事务开始之前以及存在和事务期间没有被删除的数据版本
    • 写操作:写操作不会覆盖原有数据,而是创建一个新的版本,新版本的事务ID就是当前事务ID.旧版本依旧保留以供其它事务读取。
      为什么这样基于版本迭代的读写操作不会相互阻塞呢?本质还是因为写操作不会覆盖原版本数据,而是重新生成一个版本,旧版本还在。
  • 同时可以解决脏读、幻读、不可重复读等事务隔离问题,但不能解决更新丢失问题。

隐藏列字段

在MySQL的多版本并发控制(MVCC)中,每个行记录都会包含三个隐藏字段,以支持事务和并发控制。具体来说,这三个隐藏字段是:

  • DB_TRX_ID:6 byte,最近修改(修改或者插入)事务ID。
  • DB_ROLL_PTR :7 byte,回滚指针,指向这条记录的上一个版本(形成版本链,每个节点都对应一个版本),该指针用于支持回滚操作和一致性读。通过这个指针MVCC能够找到该行的历史版本数据。
  • DB_ROW_ID:6 byte,隐含的自增ID(隐藏主键),如果表没有指定主键,InnoDB会自动以DB_ROW_ID为键值产生一个聚簇索引
  • 补充: flag字段用于存储行的内部状态或属性,比如当行被删除时,该标记就会记录该行被删除了。

比如执行下面sql:

insert into student (name, age) values ('张三', 28);

新插入的这一行数据还会包含隐藏字段,展开就是(不考虑flag):
在这里插入图片描述
目前并不知道创建该记录的事务ID,隐式主键,我们就默认设置成null,1。第一条记录也没有其他版本,我们设置回滚指针为null。

undo日志

Undo 日志记录了事务在修改数据之前的数据状态,这样在事务回滚时,可以将数据恢复到原来的状态。这也是事务能回滚的关键原因。并且,为了实现读写并发,MySQL 使用 Undo 日志来保存数据的旧版本,从而实现快照读

下面基于版本链给出相关的两个概念

  • 快照读
    快照读其实就是MVCC的一种读模式,快照读查询到的数据是事务开始时的数据,而不是最新版本的数据。这样就能保证不受其它事务修改的影响。 简单来说,快照读读取的是历史版本。
  • 当前读:当前读读取的是最新记录

那么如何确定当前事务是快照读还是当前读呢?这就是靠事务的隔离级别来决定了。如果是隔离级别为RU(读未提交)就是当前读,如果是RR(重复读)就是快照读。

假设现在给一个表中插入诺干条数据,其undo日志记录的版本链大致如下:
在这里插入图片描述

Read view

Read view就是快照读操作产生的一个读视图(也称为快照),本质就是生成一个类对象,该对象包含了快照读时的数据库状态,本质是为进行可见性判断服务的机制。即通过对比读试图中的属性,我们能知道当前事务能看到数据版本的范围。更为详细的,ReadView类包含的信息可以通过以下类结构观察:

class ReadView {// 省略...private:/** 高水位,大于等于这个ID的事务均不可见*/trx_id_t m_low_limit_id;/** 低水位:小于这个ID的事务均可见 */trx_id_t m_up_limit_id;/** 创建该 Read View 的事务ID*/trx_id_t m_creator_trx_id;/** 创建视图时的活跃事务id列表*/ids_t m_ids;/** 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,* 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/trx_id_t m_low_limit_no;/** 标记视图是否被关闭*/bool m_closed;// 省略...
};

从以上代码提取中重要的几个字段:

  • m_ids: 当前活跃的事务ID列表。生成ReadView时,系统中所有正在运行的事务ID都会被记录在这个列表中。
  • m_up_limit_id:生成ReadView时刻,当前活跃事务中最小的事务ID。所有事务ID小于该值的事务都已经结束了
  • m_low_limit_id:生成ReadView时刻,下一个还未分配的事务ID,也就是当前所有出现过的事务的最大事务ID+1。
  • m_creator_trx_id :创建该ReadView的事务ID

有了读视图,我们就能确定版本链中哪些版本可以被该事务读到。具体的比较函数实现如下:
在这里插入图片描述
将上述代码拆分成三个部分:

  • 第一部分
    在这里插入图片描述
    这个代码片段的意思是,如果当前版本事务ID小于m_up_limit_id表示该版本在当前所有活跃事务开始之前生成,因此该版本是可见的。或者当前版本事务ID等于m_creactor_trx_id,表示该版本就是当前事务生成的,因此也是可见的。

  • 第二部分
    在这里插入图片描述
    改代码片段的意思是,如果当前版本事务ID大于m_low_limit_id表示这个版本是在生成read view之后开始的事务生成的版本,因此是不可见的。之后再判断m_ids是否为空,为空表示当前事务开始时没有其他事务正在运行,因此是可见的。

  • 第三部分
    在这里插入图片描述

该代码表示,在m_ids列表中去找id,如果找到了,说明产生该版本的事务在活跃列表中,且还未结束,所以不可见。如果没找到,说明生成该版本的事务原来在活跃列表中,但是当前结束了,所以是可见的

于是通过遍历版本链中的版本,选择可见的数据版本,并依次遍历。这个筛选动作在select的时候就会自动执行。

RR和RC的本质区别

现在给出一张表,表结构如下:

create table if not exists account(id int primary key, name varchar(50) not null default '', blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

操作流程如下(RR模式下):

  • 测试一
    在这里插入图片描述
    事务A和事务B同时开启,两者几乎同时select,生成readview(读视图)。之后事务A修改表中数据并马上提交,此时事务B并没有读到事务A的修改结果,使用共享锁后才能读到(通过加共享锁可以强行变成当前读,此时读到的是最新数据)。这样的结果符合我们的预期,因为事务B生成的readview对象中m_ids包含了事务A的id,于是事务A生成的版本就不可见了。同时也符合RR隔离级别的

  • 测试二
    在这里插入图片描述
    测试一和测试二的区别在于,事务B的select操作在事务A提交之后,这样一来,当事务B生成read view对象是, 事务A生成数据的版本ID都小于事务B的m_up_limit_id,表示生成该版本的事务已经结束了,于是B可以看见A的修改结果

总结

综上,我们可以从readview的角度来思考RR和RC级别的不同之处

  • 在RC级别下,每次快照读都会生成read view,也意味着该隔离级别下事务的可见性在变化,这也能解释为什么一个事务提交前另一个事务看不见,提交后就能看见了。
  • 在RR级别下,只会在首次快照读的地方生成read view,此后不会在生成新的。这也意味着可见性是固定的,这也能解释为什么该隔离级别可以解决不可重复读等问题。

相关文章:

【MySQL事务】深刻理解事务隔离以及MVCC

文章目录 什么叫事务事务的提交方式常见的事务操作方式事务的开始与回滚总结 事务的隔离设置隔离级别解释脏读解释幻读解释不可重复读为什么可重复读不能解决幻读问题&#xff1f;总结 数据库并发的场景MVCC隐藏列字段undo日志Read view RR和RC的本质区别总结 什么叫事务 在My…...

关于Mac mini 10G网口的问题

问题: 购入一个10G网口的Mac mini M2&#xff0c;将其和自己的2.5G交换机连接&#xff0c;使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿&#xff0c;几乎是几秒钟卡一下&#xff0c;使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…...

计算机网络-第4章 网络层

4.1网络层的几个重要概念 4.1.1网络层提供的两种服务 电信网面向连接通信方式&#xff0c;虚电路VC。 互联网设计思路&#xff1a;网络层要设计得尽量简单&#xff0c;向其上层只提供简单灵活的&#xff0c;尽最大努力交付的数据报服务。 网络层不提供服务质量的承诺&#…...

pytorch跑手写体实验

目录 1、环境条件 2、代码实现 3、总结 1、环境条件 pycharm编译器pytorch依赖matplotlib依赖numpy依赖等等 2、代码实现 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matpl…...

利用Java的`java.util.concurrent`包优化多线程性能

利用Java的java.util.concurrent包优化多线程性能 一、引言 在Java的多线程编程中&#xff0c;性能优化是一个永恒的话题。随着多核CPU的普及和计算任务的日益复杂&#xff0c;多线程编程已经成为提高应用程序性能的重要手段。然而&#xff0c;多线程编程也带来了一系列的问题…...

软件著作权申请:开发者的重要保障与助力

一、引言 随着信息技术的飞速发展&#xff0c;软件产业已成为推动经济增长的重要动力。然而&#xff0c;在软件开发过程中&#xff0c;保护创作者的权益、防止抄袭和侵权行为显得尤为重要。软件著作权作为保护软件开发者权益的重要法律工具&#xff0c;其申请和登记流程对于软…...

WLAN Hostapd配置参数详解 - CN

想必大家平台在调试Hostapd时&#xff0c;针对某些特殊的参数&#xff0c;很难一下子理清楚其用法&#xff0c;这里对hostapd使用的配置参数进行一个归纳&#xff0c;以供大家参考&#xff08; 其英文参考为&#xff1a;WLAN Hostapd配置参数详解 - EN-CSDN博客&#xff09;&am…...

Excel 宏录制与VBA编程 ——VBA编程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)

Uniom方法 使用Union方法可以将多个非连续区域连接起来成为一个区域&#xff0c;从而可以实现对多个非连续区域一起进行操作。 Resize方法 使用Range对象的Resize属性调整指定区域的大小&#xff0c;并返回调整大小后的单元格区域。 Cells方法 Cells属性返回一个Range对象。 Us…...

基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候&#xff0c;总是报错&#xff0c;因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y&#xff0c;当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…...

net Framework OAuth2.0

grant_type client_credentials 客户端凭证password 密码模式 用于资源所有者密码凭据token 隐藏式 、 简化式 简化模式又称为隐式授权码模式&#xff0c;它是授权码模式的一个简化版本authorization_code 授权码 A. 第三方程序向资源拥有者(用户)发送授权请求&#xf…...

速盾:服务器cdn加速超时如何解决?

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种将网站内容分布到全球各地服务器上的技术&#xff0c;以提高网站的访问速度和用户体验。然而&#xff0c;在使用CDN时&#xff0c;有时候会遇到服务器CDN加速超时的问题&#xff0c;即CDN服…...

2024年6月总结及随笔之打卡网红点

1. 回头看 日更坚持了547天。 读《人工智能时代与人类未来》更新完成读《AI未来进行式》开更并更新完成读《AI新生&#xff1a;破解人机共存密码》开更并持续更新 2023年至2024年6月底累计码字1267912字&#xff0c;累计日均码字2317字。 2024年6月码字90659字&#xff0c;…...

《Windows API每日一练》7.4 状态报告上使用计时器

这一节我们使用计时器&#xff0c;每隔一秒获取当前鼠标坐标位置的像素值&#xff0c;并显示在窗口&#xff0c;这就相当于是一个简单的取色器了。 本节必须掌握的知识点&#xff1a; 第47练&#xff1a;取色器 7.4.1 第47练&#xff1a;取色器 /*----------------------------…...

python实现API调用缓存

python实现API调用缓存 1.代码2.输出3.保存的json数据 想把python某些函数的参数及返回值记录下来,如果之前已计算过,则直接返回缓存中的数据 1.代码 import jsondef get_variable_name(var):变量转变量名local_varsglobals()return [name for name, value in local_vars.ite…...

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块

无线音频应用中&#xff0c;远距离音频传输在许多领域具有广泛的应用需求&#xff0c;例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求&#xff0c;音频传输模块需要具备一些关键特性&#xff0c;包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…...

前端css性能优化

前端css性能优化 1. 减少样式表数量和压缩文件大小&#xff1a; 通过合并多个样式表、删除未使用的样式、压缩样式表等方式来减少样式表数量和大小&#xff0c;从而减少网络请求和提高加载速度。 通常来说&#xff0c;样式文件会被浏览器缓存&#xff0c;进入到其他页面样式文件…...

如何在Windows上使用Docker搭建PHP开发环境

前言 在本地搭建开发环境我好像没几年就要折腾一次&#xff0c;因为本地开发电脑使用的是windows&#xff0c;早些年的时候&#xff0c;用过很多类似WAMP之类的东西&#xff0c;但最终都有或多或少不满意的地方&#xff0c;前两年的时候&#xff0c;还折腾过WSL&#xff0c;但…...

java 单例模式

Java中实现单例模式的常见方式有两种&#xff1a;懒汉式和饿汉式。以下是这两种方式的简单示例&#xff1a; 饿汉式 饿汉式单例模式在类加载时就完成了实例的初始化&#xff0c;以空间换时间&#xff0c;确保了实例的唯一性。 public class Singleton {// 在自己内部定义自己…...

爬虫 属性 方法

在Python中&#xff0c;爬虫常用于从网页上抓取数据。BeautifulSoup是一个流行的库&#xff0c;用于从HTML或XML文件中提取数据。它创建了一个解析树&#xff0c;方便你从文档中查找、修改或导航数据。 安装BeautifulSoup 首先&#xff0c;你需要安装BeautifulSoup和lxml&…...

HEX文件

什么是hex文件 以*.hex为后缀的文件我们称之为HEX文件。hex是intel规定的标准&#xff0c;hex的全称是Intel HEX&#xff0c;此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。HEX的英语原始意思是16进制…...

人机融合的智能操作系统

操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。它的职责常包括对硬件的直接监管、对各种计算资源&#xff08;如内存、处理器时间等&#xff09;的管理、以及提供诸如…...

数据结构之二叉树概念

数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树&#xff08;二叉排序树、二叉查找树&#xff09;&#xff0c;平衡二叉树红黑树 B树类型B树&#xff08;B-树、B_树&#xff09;B树B*树 二叉树 简介 二叉树(Binary Tree) &#xff1a;是一种非常重要…...

Linux源码阅读笔记08-进程调度API系统调用案例分析

kthread_create_on_node kthread_create_on_node函数功能&#xff1a;指定存储节点创建新内核线程。源码如下&#xff1a; 操作实战 #include <linux/module.h> #include <linux/pid.h> #include <linux/sched.h> #include <linux/kthread.h> #inclu…...

短视频抓取:成都柏煜文化传媒有限公司

短视频抓取&#xff1a;技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;成为现代人生活娱乐的重要组成部分。然而&#xff0c;在海量短视频内容中&#xff0c;如何高效、准确地抓取目标视频&#xff0c;成为了一个…...

proto的前后端使用

首先定义一个input.proto文件 内容如下 syntax "proto3";message InputData {int32 UserId 1; // 将 number 改为 int32 或 int64string UserInput 2;string DrunkState 3; }message ResponseData {string AIResponse 1;string prompt 2;string emoti…...

华为解决固态硬盘致命弱点:延长30~50%的SSD寿命

如今的SSD容量越做越大&#xff0c;企业级SSD容量已达30TB、60TB的、甚至120TB。但SSD寿命一直是“致命伤”&#xff0c;越大容量的盘&#xff0c;出现故障后&#xff0c;丢失的数据就越多。 近日&#xff0c; 华为数据存储发文&#xff0c;揭开华为全闪分布式存储让SSD大盘更“…...

登录验证码高扩展性设计方案

登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案&#xff0c;通过工厂模式策略模式&#xff0c;增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性&#xff0c;实现了服务组件的多样化&#xff0c;降低了维护成本 登录验证码高…...

Spring MVC数据绑定和响应——数据回写(一)普通字符串的回写

接下来通过HttpServletResponse输出数据的案例&#xff0c;演示普通字符串的回写&#xff0c;案例具体实现步骤如下。 1、创建一个数据回写类DataController&#xff0c;在DataController类中定义showDataByResponse()方法&#xff0c;用于测试在Spring MVC中普通字符串的回写…...

怎样才能更好地保护个人账号的安全

怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分&#xff0c;以下是一些有效的措施来增强账号的安全性&#xff1a; 1. 使用强密码 复杂性&#xff1a;创建包含大小写字母、数字和特殊字符的密码。长度&#xff1a;密码至少应有12个字符长。唯一…...

react native优质开源项目

React Native 是一个非常流行的用于构建跨平台移动应用程序的框架&#xff0c;开源社区贡献了许多优质的项目和库。以下是一些备受认可的 React Native 开源项目&#xff0c;适合用来学习和参考&#xff1a; ### 1. **React Native Elements** [React Native Elements](https:…...

速盾:海外cdn有哪些优缺点呢?

海外 CDN&#xff08;内容分发网络&#xff09;是一种通过在全球多个节点上分布内容来加速网站访问速度的服务。它通过将网站的静态内容缓存到全球各地的服务器上&#xff0c;使用户可以从最近的服务器获取内容&#xff0c;从而提高网站的响应速度和用户体验。然而&#xff0c;…...

Unity Shader 软粒子

Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候&#xff0c;就需要一些粒子点缀&#xff0c;此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点&#xff0c;可以用Vertex Color与…...

nextTick的应用和原理理解

一.代码的理解 <template><div id"app"><div></div><button click"fn" ref"box"> {{ name }}</button></div> </template><script> export default {data: function () {return {n…...

.Net Core 微服务之Consul

目录 一、微服务架构 vs 单体架构 1. 单体架构介绍 2. 微服务架构介绍 3. 微服务架构 vs 单体架构的区别 4. 适用场景和选择 4.1 微服务架构的适用场景和选择 复杂度和规模需求高的应用程序: 技术栈的灵活性需求: 快速迭代和持续交付: 高可用性和容错性的要求: 4…...

速盾:cdn流量调度

CDN&#xff08;Content Delivery Network&#xff09;是指内容分发网络&#xff0c;它是一种通过部署在不同地理位置的服务器来传递互联网内容的技术。CDN的主要目标是通过将内容放置在离用户最近的服务器上&#xff0c;来提高用户访问网站的响应速度和性能。 CDN的流量调度是…...

Windows批处理入门:快速掌握批处理脚本的基本技巧

一、前言 在Windows操作系统中&#xff0c;批处理文件&#xff08;Batch File&#xff09;是一种非常实用的工具&#xff0c;它允许用户通过简单的命令行脚本来自动化各种任务。无论是系统管理员、开发人员&#xff0c;还是普通用户&#xff0c;掌握批处理文件的基本知识都能极…...

【C++之unordered_set和unordered_map的模拟实现】

C学习笔记---025 C之unordered_set和unordered_map的模拟实现1、unordered_set的模拟实现2、unordered_map的模拟实现 C之unordered_set和unordered_map的模拟实现 前言&#xff1a; 前面篇章学习了C对unordered_set和unordered_map的认识和应用&#xff0c;接下来继续学习&am…...

服务器使用别人的conda

很多台机器都共用一个conda时候&#xff0c;可以在conda的bin目录下运行./conda init来使得该环境机器用这个conda作为默认的conda。 但是有个环境报错&#xff1a; -bash: ./conda: /apdcephfs_cq8/share_1367250/jaimeji/anaconda/jaime_conda/bin/python: bad interpreter:…...

农村程序员陈随易2024年中总结

今天是 2024年7月1日&#xff0c;时间如白驹过隙&#xff0c;今年已去其一半。 总结一下今年上半年的情况&#xff0c;给大家提供一些参考和建议。 希望大家关注一下公众号 陈随易&#xff0c;有些内容只在公众号发表。 先看看我的年初计划&#xff0c;这个在今年年初的时候&…...

Spring Boot中的日志管理最佳实践

Spring Boot中的日志管理最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下在Spring Boot应用中如何有效管理日志&#xff0c;确保系统…...

python基础语法 004-2流程控制- for遍历

1 遍历 1.1 什么是遍历&#xff1f; 可以遍历的元素&#xff1a;字符串、列表、元组、字典、集合字符串是可以进行for 循环。&#xff08;容器对象&#xff0c;序列&#xff09;可迭代对象iterable 例子&#xff1a; 1 &#xff09;、for遍历字符串&#xff1a; name xiao…...

【高考志愿】医学

目录 一、明确职业定位与兴趣 二、选择大学与专业 三、考虑身体条件 四、了解录取规则 五、考虑选科与成绩 六、注意志愿填报策略 七、关注就业前景 八、资深医生的建议 高考志愿填报学医时&#xff0c;考生需要综合考虑多个因素&#xff0c;确保自己能够做出明智的选择…...

音视频开发31 FFmpeg 编码- avcodec_find_encoder和avcodec_find_encoder_by_name

avcodec_find_encoder /** * Find a registered encoder with a matching codec ID. * * param id AVCodecID of the requested encoder * return An encoder if one was found, NULL otherwise. */ AVCodec *avcodec_find_encoder(enum AVCodecID id); 那么这个 AVCodec…...

大模型压缩:基于贝叶斯优化的自适应低秩分解

1.方法 1.1 基于特征的高维空间低秩分解 PCA已经是老朋友了&#xff0c;每次一说主成分都会出现PCA。这篇文章1利用预训练数据的子集作为校准数据集 D c a l { x i } i 1 n \mathcal{D}_{cal}\{x_{i}\}_{i1}^{n} Dcal​{xi​}i1n​&#xff0c;首先用校准数据集的样本协方差…...

【Python函数编程实战】:从基础到进阶,打造代码复用利器

文章目录 &#x1f68b;前言&#x1f680;一、认识函数&#x1f308;二、函数定义❤️三、函数调用⭐四、实参与形参&#x1f4a5;1. 形式参数&#x1f6b2;2. 实际参数&#x1f525;1. 位置参数☔2. 关键字参数&#x1f3ac;3. 默认参数&#x1f525;4. 可变数量参数(不定长参…...

ZooKeeper 应用场景深度解析

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 1.…...

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…...

2.2章节python的变量和常量

在Python中&#xff0c;变量和常量有一些基本的概念和用法&#xff0c;但需要注意的是&#xff0c;Python本身并没有内置的“常量”类型。然而&#xff0c;程序员通常会遵循一种约定&#xff0c;即使用全部大写的变量名来表示常量。 一、变量 在Python中&#xff0c;变量是一…...

豆包文科成绩超了一本线,为什么理科不行?

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践&#xff0c;基于大语言模型和RAG技术&#xff0c;集合海量工业领域生态资源方优质产品和知识服务&#xff0c;旨在通过智能搜索、连续交互&#xff0c;实时生成个性化的内容…...

Java多线程编程实践中的常见问题与解决方案

Java多线程编程实践中的常见问题与解决方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; **1. **引言 Java多线程编程是现代软件开发中不可或缺的一部分&a…...

remix测试文件测试智能合约

remix内其实也是可以通过编写测试文件来测试智能合约的&#xff0c;需要使用插件自动生成框架以及测试结果。本文介绍一个简单的HelloWorld合约来讲解 安装插件多重检测&#xff1a; &#xff08;solidity unit testing&#xff09; 编译部署HelloWorld合约 // SPDX-License-…...

PySide(PyQt),记录最后一次访问文件的路径

1、在同目录下用文本编辑器创建JSON文件&#xff0c;命名为setting.json&#xff0c;并输入以下内容后保存&#xff1a; { "setting": { "last_file": [ "" ] } } 2、应用脚本&#xff1a; import json …...

记录前端发现问题之 mock接口无返回数据导致所有后续接口调用报错:网络异常

1. 背景 就更新了代码&#xff0c;发现新涉及的页面&#xff0c;切换tab 之后会报错网络异常&#xff0c;再次切换其他没涉及的功能页面&#xff0c;继续报错网络异常 测试环境&#xff1a;纯前端代码&#xff0c;后端是前端mock的数据&#xff0c;仅供demo 2. 问题报错 手动…...

入职字节外包2个月后,我离职了...

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…...

SpringBoot整合Minio

文章目录 1 Minio1.1 概述1.2 应用场景1.3 Minio实现分片上传的主要步骤1.4 Centos7安装Minio1.5 搭建springboot 环境1.5.1 pom.xml1.5.2 创建容器桶1.5.3 编写配置文件1.5.4 常量类1.5.5 创建Minio的配置类1.5.5 创建Minio的工具类1.5.6 创建Ajax请求工具类1.5.7 创建Minio文…...

SQL经典面试题

根据如下订单表orders的字段和类型&#xff0c;按要求写出满足条件的SQL语句&#xff1a; order_iduser_idproduct_idpaid_timeis_refunded1001123A2023-10-24 11:14:0701002123B2023-10-25 18:03:2401003234C2023-11-11 00:03:3211004456D2023-11-11 01:10:0101005234A2023-1…...

7.2秒!大众途昂尊荣四驱高速极限测试

大众途昂高速极限测试。你想知道大众途昂尊荣四驱在高速上的极限速度吗?今天来进行一场高速极限测试。动力方面搭载一台2.5TV6发动机,最大马力为299匹,最大扭矩为500牛米,官方百公里加速时间为7.2秒。大众途昂尊荣四驱是一款以性能出色、操控稳定而著称的SUV车型,无论是越…...

采用CTB电池、11合1电驱,银河E5高调登场

自2023年2月发布以来,银河系列通过陆续上新银河L7、银河L6、银河E8,仅用了10个月,累计销量就突破12万辆,得到用户的认可。随着技术的迭代,也为了进一步提升品牌影响力,满足用户需求,日前吉利银河发布了旗下全新紧凑型纯电SUV——银河E5的官图。新车将在今年第二季度上市…...

最长续航708公里阿尔法S5足以让Model3汗颜?

近日,极狐阿尔法S5已开启预售,预售价格分别为19.98万元、21.98万元,这款定位中型轿车的纯电是否有让同级竞品——Model 3汗颜的实力呢?据了解,阿尔法S5以电动性能著称,新车采用了豪华纯电车型中才会见到的同步+异步双电机组合,总功率高达390kW,总扭矩达到690Nm,百公里…...

Git钩子(Hooks)之commit之前自动执行脚本

介绍 官方文档&#xff1a; 英文&#xff1a;https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks中文&#xff1a;https://git-scm.com/book/zh/v2/自定义-Git-Git-钩子 下面只复制了pre-commit部分文档&#xff0c;其他详见官方文档。 Git Hooks Like many other…...

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…...

Selenium 库的爬虫实现

Selenium 是什么&#xff1f; Selenium 是一个用于自动化 Web 应用程序测试的工具。它提供了一个用于测试网站的框架&#xff0c;可以模拟用户在浏览器中的操作&#xff0c;如点击链接、填写表单、提交数据等。Selenium 可以在多种浏览器和操作系统上运行&#xff0c;并且支持…...