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

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

【JavaEE】Spring事务(2)

在这里插入图片描述

文章目录

  • 【JavaEE】Spring事务(2)
    • 1. @Transactional 参数介绍
      • 1.1 value 和 transactionManager
      • 1.2 timeout
      • 1.3 readOnly
      • 1.4 后面四个
      • 1.5 isolation 与 propagation
    • 2. Spring 事务隔离级别 - isolation
      • 2.1 MySQL事务隔离级别
      • 2.2 MySQL默认有没有解决幻读
      • 2.3 Spring的五种事务隔离级别
    • 3. Spring 事务传播机制 - propagation
      • 3.1 事务传播机制是什么?
      • 3.2 为什么需要事务传播机制?
        • 3.2.1 事务隔离级别
        • 3.2.2 事务传播机制
      • 3.3 Spring 事务的七种事务传播机制
        • 3.3.1 propagation的七个取值
        • 3.3.2 propagation的七个取值各自的作用
      • 3.4 支持当前事务的三种传播机制
        • 3.4.1 REQUIRED
        • 3.4.2 REQUIRED例子
        • 3.4.3 SUPPORTS
        • 3.4.4 SUPPORTS例子
        • 3.4.5 MANDATORY
        • 3.4.6 MANDATORY例子
      • 3.5 不支持当前事务的三种传播机制
        • 3.5.1 REQUIRES_NEW
        • 3.5.2 NOT_SUPPORTED 与 NEVER
      • 3.6 嵌套事务
        • 3.6.1 NESTED
        • 3.6.2 NESTED例子
        • 3.6.3 加入事务和嵌套事务的区别
        • 3.6.4 嵌套事务的逻辑(加入事务和嵌套事务的区别:有无保存点)

【JavaEE】Spring事务(2)

1. @Transactional 参数介绍

参数作用
value当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器
transactionManager当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器
isolation事务的隔离级别.默认值为solation.DEFAULT
propagation事务的传播机制,默认值为 Propagation.REQUIRED
timeout事务的超时时间,默认值为-1.如果超过该时间限制但事务还没有完成,则自动回滚事务
readOnly指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置read-only为 true.
rollbackFor用于指定能够触发事务回滚的异常类型,可以指定多个异常类型
rollbackForClassName用于指定能够触发事务回滚的异常类型,可以指定多个异常类型
noRollbackFor抛出指定的异常类型,不回滚事务,也可以指定多个异常类型
noRollbackForClassName抛出指定的异常类型,不回滚事务,也可以指定多个异常类型

1.1 value 和 transactionManager

其实默认就是一个Spring事务管理器,但是如果你是多个数据源等情况下,是可能用到多个事务管理器的,所以要使用哪个事务管理器,用这两个属性来区分(两个的作用一致,同时存在就是为了保证兼容性呗)

目前只看作只有一个事务管理器,之后遇到再说~

1.2 timeout

指定超时时间:

  1. 默认为-1,即没有时间限制
  2. 指定时间(/s)后,超过时间限制事务就会强制回滚

1.3 readOnly

  1. false => 不是只读事务
  2. true => 是只读事务
    • 此时若要进行写的操作,会出现错误
    • 只读事务内,同一个查询方法的多次调用查询结果一致,不会读取到其他事务修改的数据

只是读操作的话,其实不需要回滚,但是又需要配合一些事务的传播行为以及保证一些查询结果一致性,就可以设置为true去优化性能,了解即可

1.4 后面四个

无非就是:

  1. 指定捕获的异常的类对象,只有捕获对应的异常才能回滚
  2. 指定捕获的异常的类名称,只有捕获对应的异常才能回滚
  3. 指定捕获的异常的类对象,捕获对应的异常不能回滚
  4. 指定捕获的异常的类名称,捕获对应的异常不能回滚

并且可以传数组…

1.5 isolation 与 propagation

  1. isolation 事务的隔离级别
  2. propagation 事务的传播机制

随后重点讲解

2. Spring 事务隔离级别 - isolation

在这里插入图片描述

Spring设置事务隔离解绑是通过@Transactional的isolation属性,并且用Isolation枚举类去访问设置常量

在这里插入图片描述

2.1 MySQL事务隔离级别

  1. READ UNCOMMITTED:读未提交
  2. READ COMMITTED:读已提交
  3. REPEATABLE READ:可重复读,是 MySQL 的默认事务隔离级别
  4. SERIALIZABLE:序列化

补充说明:本文一些具体细节就不讲了,比如MySQL的知识

  • 脏读:一个事务读取到了另⼀个事务修改的数据之后,后⼀个事务又进行了回滚操作,从而导致第⼀个事务读取的数据是错误的。
  • 不可重复读:⼀个事务两次查询得到的结果不同,因为在两次查询中间,有另⼀个事务把数据修改了。
  • 幻读:⼀个事务两次查询中得到的结果集不同,因为在两次查询中另⼀个事务有新增了⼀部分数据。

四种隔离级别对着三种情况的应对情况是这样的:

事务隔离级别(isolation)脏读问题不可重复读问题幻读
READ UNCOMMITTED:读未提交没有解决没有解决没有解决
READ COMMITTED:读已提交解决没有解决没有解决
REPEATABLE READ:可重复读解决解决有解决,但没完全解决
SERIALIZABLE:序列化解决解决解决

MySQL默认:select @@global.tx_isolation,@@tx_isolation;

在这里插入图片描述

2.2 MySQL默认有没有解决幻读

有,但是没有彻底解决

对于MySQL默认是RR(REPEATABLE READ:可重复读)+ MVCC(Multi-VersionConcurrency Control:多版本并发控制) 去解决幻读的,对于

  • 快照读:MVCC解决得了幻读
  • 当前读:MVCC解决不了,得加锁

所以要想彻底解决幻读:

  1. 串行化
  2. MVCC + 锁

2.3 Spring的五种事务隔离级别

其实其中四种跟MySQL一致:

在这里插入图片描述

而多了的一种就是DEFAULT:含义就是,以配置的数据库的全局事务隔离级别为准~

@Transactional(isolation = Isolation.DEFAULT)
//默认设置
  • 如果是MySQL的话,就是RR
  • 如果设置了隔离级别(isolation = …),且数据库支持的话,这个"局部"事务临时以这个隔离级别为准

网络资料:

如果使用@Transactional注解**设置了一个在当前数据库中不支持的隔离级别**,会发生下列情况之一:

  1. 编译错误:编译过程中可能会出现错误,指示该隔离级别不可用。
  2. 运行时异常:编译器无法在编译时捕获到错误,那么在运行时可能会抛出异常。具体的异常类型和处理方式取决于使用的事务管理框架和数据库驱动程序。

通常情况下,当设置了一个不支持的隔离级别时,事务管理框架会尝试使用一个与之最接近的可用隔离级别。例如,假设设置的隔离级别是"SERIALIZABLE"

  • 但数据库只支持"READ_COMMITTED"和"REPEATABLE_READ"两个隔离级别。在这种情况下,事务管理框架可能会自动选择使用"REPEATABLE_READ"作为隔离级别。

  • 但是需要注意的是,不同的事务管理框架和数据库驱动程序的行为可能会有所不同。因此,建议在设置隔离级别之前,先了解所使用的数据库是否支持所需的隔离级别,并确保事务管理框架和数据库驱动程序的兼容性。

3. Spring 事务传播机制 - propagation

3.1 事务传播机制是什么?

Spring 事务传播机制定义了多个事务的方法,相互调用时,事务是如何在这些方法之间进行传递的

传播行为定义了事务方法之间的事务边界,控制着事务方法在调用过程中对事务的影响

不必纠结传播这个资源,它就只是个词语罢了,其含义就是 事务方法被调用时进行的“行为逻辑”

  • propagation传播就是事务扩展嘛,就是因为调用了方法,事务就要扩展(你可以理解为调用者事务和被调用者事务是extends的关系)了,要怎么扩展(事务之间的继承规则是咋样的)就是行为逻辑的机制咯

3.2 为什么需要事务传播机制?

3.2.1 事务隔离级别

事务隔离级别解决的问题是多个事务同时调用数据库的问题,即并发事务执行的可控性和稳定性:

在这里插入图片描述

3.2.2 事务传播机制

事务传播机制解决的则是保证了一个事务在多个调用方法的可控性和稳定性

举一个例子,事务A调用事务B,那么整体看成一个事务呢,还是分开来看,还是要咋样咋样,这些都是要规定的,而我们就是通过设置一个事务的传播机制,去控制,达到我们想要的效果~

在这里插入图片描述

3.3 Spring 事务的七种事务传播机制

3.3.1 propagation的七个取值

在这里插入图片描述

一样的,Propagation也是个枚举类型,通过访问其内部常量来给propagation赋值:

在这里插入图片描述

Spring事务的默认值为:Propagation.REQUIRED

@Transactional(propagation = Propagation.REQUIRED)
// 默认设置

3.3.2 propagation的七个取值各自的作用

propagation作用
REQUIRED默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建⼀个新的事务。
SUPPORTS如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的⽅式继续运行。
MANDATORY(mandatory:强制性)如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
NOT_SUPPORTED以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。

对于七种传播机制,可以分为三类:

  1. 支持当前事务
    • REQUIRED(没事务我就造,有事务我就入)
    • SUPPORTS(没事务我就摆)
    • MANDATORY(没事务我就闹)
  2. 不支持当前事务(不常使用)
    • REQUIRES_NEW
    • NOT_SUPPORTED
    • NEVER
  3. 嵌套事务
    • NESTED

非事务方式运行代表的含义就是,这个方法不是个事务,但是参与了事务传播机制的逻辑规范

3.4 支持当前事务的三种传播机制

3.4.1 REQUIRED

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {// 代码逻辑
}

methodA()方法使用REQUIRED传播机制

  1. 当该方法被调用时,如果当前已存在一个事务,则methodA()将会使用该事务,或者说是加入该事务(融合成一个大事务)
  2. 如果没有事务,则会为methodA()创建一个新的事务

3.4.2 REQUIRED例子

在这里插入图片描述

在这里插入图片描述

调用链就是这样的:

在这里插入图片描述

没有报异常的现象:

在这里插入图片描述

在这里插入图片描述

在insert方法返回前加异常:

在这里插入图片描述

控制台:

在这里插入图片描述

在这里插入图片描述

无新增,代表已回滚

验证,不存在事务也可以创建:

在这里插入图片描述

效果:

在这里插入图片描述

控制台:

在这里插入图片描述

在这里插入图片描述

无新增

3.4.3 SUPPORTS

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {// 代码逻辑
}

methodB()方法使用SUPPORTS传播机制

  1. 当该方法被调用时,如果当前已存在一个事务,则methodB()将会使用该事务
  2. 如果没有事务,则以非事务的方式执行。

3.4.4 SUPPORTS例子

在这里插入图片描述

存在事务的情况效果:

在这里插入图片描述

在这里插入图片描述

无新增

不存在事务的情况:

在这里插入图片描述

效果:

在这里插入图片描述

在这里插入图片描述

新增数据,代表回滚失败

补充一点,你会发现一些id不连续,其实就是因为空着的id加过了,只不过被回滚了

分析:

  • add在执行的时候,当前没有事务,摆烂~
  • testService.add在执行的时候,当前没有事务,摆烂~
  • insert在执行的时候,当前没有事务,摆烂~

一开始没有事务,最终导致,这些“妈宝”一个都不创建事务,没有事务自然就没有回滚

3.4.5 MANDATORY

@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {// 代码逻辑
}

methodC()方法使用MANDATORY传播机制

  1. 当该方法被调用时,如果当前已存在一个事务,则methodC()将会使用该事务
  2. 如果没有事务,则会抛出异常
    • 不要纠结这个异常抛出没有回滚的问题,因为事务压根没开始,有啥好回滚的,所以抛出异常没啥坏影响,就是规范作用

3.4.6 MANDATORY例子

在这里插入图片描述

在这里插入图片描述

效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

无新增

报异常情况的演示:

在这里插入图片描述

效果:

在这里插入图片描述

  • 这里的异常就不是算术异常了

在这里插入图片描述

压根没添加进入那两个方法,自然没有添加数据

在这里插入图片描述

3.5 不支持当前事务的三种传播机制

3.5.1 REQUIRES_NEW

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {// 代码逻辑
}

methodD()方法使用REQUIRES_NEW传播机制

  • 当该方法被调用时,将会为methodD()创建一个新的事务,并挂起当前事务(如果存在)
  • 事务被挂起:事务停止,等待新事物执行完此事务才能继续执行

不存在的话,就是简单的创建一个事务~

3.5.2 NOT_SUPPORTED 与 NEVER

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {// 代码逻辑
}
@Transactional(propagation = Propagation.NEVER)
public void methodF() {// 代码逻辑
}

methodE()方法使用NOT_SUPPORTED传播机制

  • 当该方法被调用时,会以**非事务的方式执行操作**,并在执行期间挂起当前事务(如果存在)。

methodF()方法使用NEVER传播机制

  • 当该方法被调用时,会以**非事务的方式执行操作**,并在执行期间如果存在事务,则抛出异常。

非事务方式运行代表的含义就是,这个方法不是个事务,但是参与了事务传播机制的逻辑规范


不支持当前事务的这三种传播机制,存在即合理,只是那种情景我们还没遇到呢~

  • 这里不做代码演示,感兴趣的同学可以去了解!

3.6 嵌套事务

3.6.1 NESTED

@Transactional(propagation = Propagation.NESTED)
public void methodG() {// 代码逻辑
}

methodG()方法使用NESTED传播机制

  1. 当该方法被调用时,如果当前存在事务,则在嵌套事务内执行
  2. 如果没有事务,则创建一个新的事务,跟默认的REQUIRED一样~

3.6.2 NESTED例子

在这里插入图片描述

调用链是这样的:

在这里插入图片描述

在这里插入图片描述

  • 异常注意处理哦,否则add方法也会感应到异常,导致外部事务回滚~

效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

只增加了一条~

  • 代表insert方法是回滚了的,而testService方法事务提交成功
  • 而insert也是有返回值的,因为try后的代码还是会继续运行

3.6.3 加入事务和嵌套事务的区别

在前面加入事务的例子可以看出,加入事务就相当于融合成大事务,看成一个整体,在任何一个地方回滚,影响的都是全部(不再做演示)

而嵌套事务NEXTED,则允许整个事务,部分事务回滚(允许部分代码失败)

  1. 如果你希望内部方法能够独立于外部事务进行回滚
    • 可以选择 Propagation.NESTED
  2. 如果你希望内部方法与外部事务一同回滚或提交
    • 可以选择 Propagation.REQUIRED
  3. 整个事务如果全部执行成功,⼆者的结果是⼀样的。

嵌套这个词就体现在这特性:

  1. 内部事务回滚,不会导致外部事务也回滚
  2. 外部事务回滚,内部事务会收到牵连

内部事务就是个部件吧,相对于整个事务

加入事务:

在这里插入图片描述

嵌套事务:

在这里插入图片描述

3.6.4 嵌套事务的逻辑(加入事务和嵌套事务的区别:有无保存点)

可以将嵌套事务理解为“尝试”的动作,这个方法失败了就失败了,没关系,咱还是一条好汉~

嵌套事务之所以能够实现部分事务的回滚,是因为事务中有⼀个保存点(savepoint)的概念:

  • 嵌套事务进入当前事务之后相当于新建了⼀个保存点
  • 而滚回时只回滚到当前保存点,因此之前的事务是不受影响的

在这里插入图片描述

实心黑点就相当于保存点~

REQUIRED 是加⼊到当前事务中,并没有创建事务的保存点,因此出现了回滚就是整个事务回滚, 这也是嵌套事务和加入事务的区别

官方文档:MySQL :: MySQL 5.7 Reference Manual :: 13.3.4 SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE SAVEPOINT Statements


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

代码:事务/src/main · 游离态/马拉圈2023年8月 - 码云 - 开源中国 (gitee.com)

实际情况可能简单,也可能复杂,希望你能通过已学知识去“排列组合”,去实现和分析!


相关文章:

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

【JavaEE】Spring事务(2) 文章目录 【JavaEE】Spring事务(2)1. Transactional 参数介绍1.1 value 和 transactionManager1.2 timeout1.3 readOnly1.4 后面四个1.5 isolation 与 propagation 2. Spring 事务隔离级别 - isolation2.…...

微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

一、简介 做个简单的生成二维码海报分享,我做的时候也找简单的方法看能不能实现页面直接截图那种生成图片,原生小程序不支持,不多介绍下面有全部代码有注释、参数自行替换运行看看,还有需要优化的地方,有问题可以咨询…...

C++卷积神经网络

C卷积神经网络 #include"TP_NNW.h" #include<iostream> #pragma warning(disable:4996) using namespace std; using namespace mnist;float* SGD(Weight* W1, Weight& W5, Weight& Wo, float** X) {Vector2 ve(28, 28);float* temp new float[10];V…...

go 读取yaml映射到struct

安装 go get gopkg.in/yaml.v3创建yaml Mysql:Host: 192.168.214.134Port: 3306UserName: wwPassword: wwDatabase: go_dbCharset: utf8mb4ParseTime: trueLoc: LocalListValue:- haha- test- vv JWTSecret: nidaye定义结构体 type Mysql struct {Host string yaml:&…...

Redis 10 大数据类型

1. which 10 1. redis字符串 2. redis 列表 3. redis哈希表 4. redis集合 5. redis有序集合 6. redis地理空间 7. redis基数统计 8. redis位图 9. redis位域 10. redis流 2. 获取redis常见操作指令 官网英文&#xff1a;https://redis.io/commands 官网中文&#xff1a;https:/…...

优化生产流程:数字化工厂中的OPC UA分布式IO模块应用

背景 近年来&#xff0c;为了提升在全球范围内的竞争力&#xff0c;制造企业希望自己工厂的机器之间协同性更强&#xff0c;自动化设备采集到的数据能够发挥更大的价值&#xff0c;越来越多的传统型工业制造企业开始加入数字化工厂建设的行列&#xff0c;实现智能制造。 数字化…...

Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

一、前言 不同于之前的term。terms等结构化查询&#xff0c;全文搜索首先对查询词进行分析&#xff0c;然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据&#xff08;text类型&#xff09;,默认的数据形式是人类的自然语言&#xff0c;如对话内容、图书名…...

已解决Gradle错误:“Unable to load class ‘org.gradle.api.plugins.MavenPlugin‘”

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

windows中安装sqlite

1. 下载文件 官网下载地址&#xff1a;https://www.sqlite.org/download.html 下载sqlite-dll-win64-x64-3430000.zip和sqlite-tools-win32-x86-3430000.zip文件&#xff08;32位系统下载sqlite-dll-win32-x86-3430000.zip&#xff09;。 2. 安装过程 解压文件 解压上一步…...

前端面试:【系统设计与架构】前端架构模式的演进

前端架构模式在现代Web开发中扮演着关键角色&#xff0c;它们帮助我们组织和管理前端应用的复杂性。本文将介绍一些常见的前端架构模式&#xff0c;包括MVC、MVVM、Flux和Redux&#xff0c;以及它们的演进和应用。 1. MVC&#xff08;Model-View-Controller&#xff09;&#x…...

【CSS】em单位的理解

1、em单位的定义 MDN的解释&#xff1a;它是相对于父元素的字体大小的一个单位。 例如&#xff1a;父元素font-size&#xff1a;16px&#xff1b;子元素的font-size&#xff1a;2em&#xff08;也就是32px&#xff09; 注&#xff1a;有一个误区&#xff0c;虽然他是一个相对…...

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html...

【滑动窗口】leetcode209:长度最小的子数组

一.题目描述 长度最小的子数组 二.思路分析 题目要求&#xff1a;找出长度最小的符合要求的连续子数组&#xff0c;这个要求就是子数组的元素之和大于等于target。 如何确定一个连续的子数组&#xff1f;确定它的左右边界即可。如此一来&#xff0c;我们最先想到的就是暴力枚…...

C++ STL unordered_map

map hashmap 文章目录 Map、HashMap概念map、hashmap 的区别引用头文件初始化赋值unordered_map 自定义键值类型unordered_map 的 value 自定义数据类型遍历常用方法插入查找 key修改 value删除元素清空元素 unordered_map 中每一个元素都是一个 key-value 对&#xff0c;数据…...

全流程R语言Meta分析核心技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

Go并发可视化解释 - Select语句

昨天&#xff0c;我发布了一篇文章&#xff0c;用可视化的方式解释了Golang中通道&#xff08;Channel&#xff09;的工作原理。如果你对通道的理解仍然存在困难&#xff0c;最好呢请在阅读本文之前先查看那篇文章。作为一个快速的复习&#xff1a;Partier、Candier 和 Stringe…...

在线SM4(国密)加密解密工具

在线SM4(国密)加密解密工具...

golang的类型断言语法

例子1 在 Go 中&#xff0c;err.(interface{ Timeout() bool }) 是一个类型断言语法。它用于检查一个接口类型的变量 err 是否实现了一个带有 Timeout() bool 方法的接口。 具体而言&#xff0c;该类型断言的语法如下&#xff1a; if v, ok : err.(interface{ Timeout() boo…...

提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长

各个行业都在谈出海&#xff0c;但真正成功的又有多少&#xff1f; 李宁出海十年海外业务收入占比仅有1.3%&#xff0c;走出去战略基本失败。 京东出海业务磕磕绊绊&#xff0c;九年过去国际化业务至今在财报上都不配拥有姓名。 几百万砸出去买量&#xff0c;一点水花都没有…...

第3篇:vscode搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 1.下载vscode并安装 https://code.visualstudio.com/ 运行VSCodeUserSetup-x64-1.80.1.exe 2.点击扩展&#xff0c;搜索arduino,并点击安装 3.点击扩展设置&#xff0c;配置arduino…...

Apache Shiro是什么

特点 Apache Shiro是一个强大且易用的Java安全框架,用于身份验证、授权、会话管理和加密。它的设计目标是简化应用程序的安全性实现,使开发人员能够更轻松地处理各种安全性问题,从而提高应用程序的安全性和可维护性。下面是一些Apache Shiro的关键特点和概念: 特点和概念…...

Socket基本原理

一、简单介绍 Socket&#xff0c;又称套接字&#xff0c;是Linux跨进程通信&#xff08;IPC&#xff0c;Inter Process Communication&#xff09;方式的一种。相比于其他IPC方式&#xff0c;Socket牛逼在于可做到同一台主机内跨进程通信&#xff0c;不同主机间的跨进程通信。…...

Docker容器:本地私有仓库、harbor私有仓库部署与管理

文章目录 Docker容器&#xff1a;本地私有仓库、harbor私有仓库部署与管理一.本地私有仓库1.本地私有仓库概述2.搭建本地私有仓库3.容器重启策略简介 二.harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3、Harbor的构成4.Harbor私有仓库架构及数据流向5.harbor部署及配置…...

Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

我们都之前在封装mobx作为数据存储的时候&#xff0c;使用到了useContext作为包裹&#xff0c;将store变成了一个hooks使用&#xff0c;封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…...

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…...

Java8 Stream流常见操作--持续更新中

创建新数组 List<Fruit> newList fruits.stream().map(f -> new Fruit(f.getId(), f.getName() "s", f.getCountry())).collect(Collectors.toList())筛选数组 Map<Boolean, List<TransferData>> preAvg list.stream().collect(Collectors…...

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id&#xff0c;换句话说&#xff0c;就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…...

Qt --- 自定义提示框 类似QMessagebox

QMessageBox::information(NULL, QString("title"), QString("I am information")); 以下是自定义提示框的代码&#xff0c;有图有真相&#xff01;提示框大部分都采用模态的形式&#xff0c;关于模态也不再多提&#xff01;所以父类为QDialog&#xff0c;…...

Redis 分布式锁与 Redlock 算法实现

Redis 分布式锁与 Redlock 算法实现 一、简介1. Redis的分布式锁2. 分布式锁的实现原理 二、Redis 分布式锁使用场景1. 分布式系统中数据资源的互斥访问2. 分布式环境中多个节点之间的协作3. 常见场景及应用 三、Redlock算法的原理与实现1. Redlock算法的背景2. Redlock算法的原…...

【附安装包】Inventor2024安装教程 机械制图|三维制图

软件下载 软件&#xff1a;Inventor版本&#xff1a;2024语言&#xff1a;简体中文大小&#xff1a;5.61G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu…...

北京网站建设维护/网上交易平台

表单 json这是一个客户表单JSON文件的示例&#xff0c;您可能会看到该文件用于存储配置设置以设置系统。 它也可以用来包含记录信息&#xff0c;这些记录信息可以使用简单的JSON格式在各个组件之间轻松共享。 另外&#xff1a; 请参阅更多JSON示例。 {"firstName":…...

如何建单位内部购物网站/谷歌手机版下载安装

题目内容&#xff1a; 出题人就告诉你这是个注入&#xff0c;有种别走&#xff01; 看 URL /index.php?id1 测过滤 没有过滤&#xff1a; 空格 # 被过滤&#xff1a; order by&#xff0c;select 测能…...

儿童编程网课平台哪个好/seo优化技术教程

AtomicReference类的getAndSet()方法用于以原子方式将AtomicReference对象的值设置为newValue&#xff0c;该值作为参数传递并返回AtomicReference对象的旧值&#xff0c;并具有由VarHandle.getAndSet(java.lang.Object ... ).VarHandle.getAndSet(java.lang.Object…)指定将变…...

山东莱芜金点子信息港/伊春seo

sleep与wait区别&#xff1a;1、sleep方法是线程静态方法&#xff0c;wait方法是Object对象方法&#xff1b;2、sleep使线程休眠&#xff0c;不会释放锁&#xff1b;wait方法是在获取锁情况下进行等待的&#xff0c;等待时会释放锁&#xff1b;3、都可以响应中断。public class…...

网站开发哪里安全/友情链接教程

View类使所有UI组件的基类&#xff0c;它包含的XML属性和方法是所有组件都可使用的&#xff0c;View类的XML属性、相关方法及说明如表&#xff1a; 原文链接&#xff1a;http://blog.csdn.net/yelangjueqi/article/details/42290987 内容摘自《疯狂Android讲义》一书。...

拖拽响应式网站建设公司/百度网址大全简单版

限时特惠&#xff0c;新购低至 0.019 元/条&#xff0c;最高立减 21600 元 https://www.ucloud.cn/site/active/usms.html 转载于:https://www.cnblogs.com/jenasy/p/11453933.html...