【JavaEE进阶】Spring事务和事务传播机制

文章目录

  • 一. 什么是Spring事务
  • 二. Spring中事务的实现
    • 1. Spring编程式事务
    • 2. 声明式事务
      • 2.1 trycatch下事务不会自动回滚的解决方案
      • 2.2 @Transactional 作用范围
      • 2.3 @Transactional 参数说明
      • 2.4 @Transactional 工作原理
  • 三. 事务的隔离级别
    • 1. 事务的四大特性
    • 2. Spring中设置事务隔离级别
  • 四. Spring事务传播机制
    • 1. 事务传播机制
    • 2. 为什么需要事务传播机制
    • 3. 事务传播机制有哪些

一. 什么是Spring事务

Spring 事务是 Spring 框架提供的一种机制,用于管理数据库操作或其他资源的一组相关操作,以确保它们在一个原子、一致、可靠和隔离的执行单元内进行。事务用于维护数据的完整性并支持并发访问数据库时的数据一致性。

Spring 事务的主要特点包括:

  1. 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部不执行。如果事务中的任何一个操作失败,则整个事务将被回滚到初始状态,以保持数据的一致性。
  2. 一致性(Consistency):事务在执行之前和之后都必须使数据库保持一致状态。这意味着事务中的操作会遵循预定义的业务规则,以确保数据的有效性和完整性。
  3. 隔离性(Isolation):事务的隔离级别定义了事务之间的相互影响程度。Spring 支持多个隔离级别,例如读未提交、读已提交、可重复读和串行化。通过设置适当的隔离级别,可以控制事务之间的并发读写操作带来的数据不一致问题。
  4. 可靠性(Durability):事务在成功提交后,对数据的更新将永久保存到数据库中,即使系统发生故障或重启,数据也不会丢失。

Spring 事务通过 AOP(面向切面编程)实现,Spring事务操作分为了两种方式:

  1. 编程式事务(⼿动写代码操作事务)。
  2. 声明式事务(利⽤注解⾃动开启和提交事务)。

使用 Spring 事务可以将多个数据库操作或其他资源访问操作组织成一个逻辑单元,并确保这些操作要么全部成功执行,要么全部回滚。这有助于提高应用程序的可靠性、一致性和并发性。

其实在之前的MySQL部分,我们对事务已经有了初步的了解,忘记的小伙伴可以查看: MySQL:索引事务

二. Spring中事务的实现

1. Spring编程式事务

Spring编程式事务是是一种通过编写代码显式管理事务的方法,而不依赖于注解或配置文件。它提供了更细粒度的事务控制,允许在方法级别或代码块级别指定事务的起始、提交和回滚。
Spring手动操作事务和MySQL 操作事务类似,主要有三个操作步骤:

  1. 开启事务
  2. 提交事务
  3. 回滚事务

SpringBoot内置了两个对象,DataSourceTransactionManager用来获取事务(开启事务)、提交或回滚事务的,而TransactionDefinition是事务的属性,在获取事务的时候需要将
TransactionDefinition传递进去从而获得一个事务TransactionStatus,实现代码如下:

package com.example.demo.controller;import com.example.demo.service.UserService;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;//编程式事务:
@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;//Jdbc事务管理器@Resourceprivate DataSourceTransactionManager transactionManager;//定义事务属性@Resourceprivate TransactionDefinition transactionDefinition;@RequestMapping("/del")public int del(Integer id){if(id == null || id < 0){return 0;}//1. 开启事务TransactionStatus transactionStatus = null;int result = 0;try{transactionStatus = transactionManager.getTransaction((transactionDefinition));//业务操作,删除用户result = userService.del(id);System.out.println("删除: "+result);//2. 提交事务/回滚事务transactionManager.commit(transactionStatus);//提交事务}catch (Exception e){if(transactionStatus != null){transactionManager.rollback(transactionStatus);//回滚事务}}return result;}}

在这里插入图片描述
启动程序,然后在浏览器中输入:即为删除id为1的admin
在这里插入图片描述
在这里插入图片描述
可以看到管理员成功被删除.
若要实现回滚操作:

@RequestMapping("/del")public int del(Integer id){if(id == null || id < 0){return 0;}//1. 开启事务TransactionStatus transactionStatus = null;int result = 0;transactionStatus = transactionManager.getTransaction((transactionDefinition));//业务操作,删除用户result = userService.del(id);System.out.println("删除: "+result);//2. 提交事务/回滚事务
//            transactionManager.commit(transactionStatus);//提交事务transactionManager.rollback(transactionStatus);//回滚事务return result;}


我们可以看到,虽然编程式事务可以实现事务,但是操作很繁琐,接下来,我们可以使用较为简单的声明式事务.

2. 声明式事务

声明式事务是利用注解自动开启和提交事务.
声明式事务的实现很简单,只需在方法上加入@Transactional 注解就可以实现,无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果途中发生了没有处理的异常就会自动回滚事务.

package com.example.demo.controller;import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user2")
public class UserController2 {@Autowiredprivate UserService userService;@Transactional(timeout = 3) // 在方法开始之前开启事务,方法正常执行结束之后提交事务,如果执行途中发生异常,则回滚事务@RequestMapping("/del")public int del(Integer id) {if (id == null || id <= 0) return 0;return userService.del(id);}
}

运行成功:
在这里插入图片描述
如果代码中有异常的话:

    @Transactional(timeout = 3) // 在方法开始之前开启事务,方法正常执行结束之后提交事务,如果执行途中发生异常,则回滚事务@RequestMapping("/del")public int del(Integer id) {if (id == null || id <= 0) return 0;int num = 10/0;return userService.del(id);}

在这里插入图片描述

2.1 trycatch下事务不会自动回滚的解决方案

但是如果加上Try catch来处理异常,此时事务就不会回滚了,数据也就正式被删除了.但是出现这种情况,它就是出现了异常,我们是想要它进行回滚操作的.我们有两种处理办法:
1. 手动抛出异常

 @Transactional(timeout = 3) // 在方法开始之前开启事务,方法正常执行结束之后提交事务,如果执行途中发生异常,则回滚事务@RequestMapping("/del")public int del(Integer id) {if (id == null || id <= 0) return 0;int result = 0;try{result = userService.del(id);System.out.println(result);int num = 10/0;}catch (Exception e){throw e;//手动将异常抛出}return result;}

2. 手动回滚事务

    @Transactional(timeout = 3) // 在方法开始之前开启事务,方法正常执行结束之后提交事务,如果执行途中发生异常,则回滚事务@RequestMapping("/del")public int del(Integer id) {if (id == null || id <= 0) return 0;int result = 0;try{result = userService.del(id);System.out.println(result);int num = 10/0;}catch (Exception e){TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}return result;}

TransactionAspectSupport.currentTransactionStatus()用于获取到当前事务,setRollbackOnly()是用于回滚的方法.

2.2 @Transactional 作用范围

@Transactional 可以用来修饰方法或类:

  1. 修饰方法时:需要注意只能应用到 public方法上,否则不生效。推荐此种用法。
  2. 修饰类时:表明该注解对该类中所有的public方法都生效。

2.3 @Transactional 参数说明

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

2.4 @Transactional 工作原理

@Transactional 的工作原理如下:

  1. 在方法执行前,Spring 根据 @Transactional 注解的配置来创建一个事务上下文,并将其与当前线程关联起来。
  2. 当方法开始执行时,Spring 检查当前线程是否已经关联了一个事务上下文。如果没有关联,则根据 @Transactional 注解的配置,启动一个新的事务。
  3. 方法执行过程中,如果没有发生异常,则 Spring 会在方法执行结束后提交事务,将对数据库的更改持久化到数据库。
  4. 如果方法执行过程中抛出了异常,Spring 将捕获该异常并判断是否需要回滚事务。根据 @Transactional 注解的配置,如果异常属于回滚规则中指定的类型,则发起事务回滚操作,撤销已经执行的数据库操作。
  5. 最后,Spring 根据事务的提交或回滚结果,进行相应的清理工作,关闭事务上下文。

需要注意的是:@Transactional 注解只对公共方法生效,因此仅能应用于公共的非静态方法.

除了直接将 @Transactional 注解应用于方法上,还可以将其应用于类上。在这种情况下,所有在该类中声明的方法都将具有相同的事务属性。

@Transactional 注解通过简化事务管理过程,提供了一种声明式的事务管理方式,使开发者能够更轻松地实现对数据库操作的事务性控制。

总之,@Transactional是基于AOP实现的,AOP又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用JDK的动态代理,如果目标对象没有实现了接口,会使用CGLIB动态代理。@Transactional在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到的异常,则回滚事务。
在这里插入图片描述
在这里插入图片描述

三. 事务的隔离级别

1. 事务的四大特性

事务的四大特性(ACID)是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),它们是关系型数据库管理系统(RDBMS)中用于保证数据操作的可靠性和一致性的基本属性。

  1. 原子性(Atomicity):事务是一个原子操作单元,要么全部执行成功,要么全部失败回滚。它是不可分割的最小操作单位,将多个操作视为一个整体进行处理。如果事务中的任何一项操作失败,所有已经执行的操作将被撤销,数据库回到事务开始前的状态。
  2. 一致性(Consistency):事务的执行使数据库从一个一致状态转移到另一个一致状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。这意味着事务在执行过程中不能破坏数据库的完整性、一致性约束以及业务规则。
  3. 隔离性(Isolation):多个并发事务之间应该相互隔离,每个事务的执行都应该与其他事务隔离开来,互不干扰。事务隔离级别定义了多个事务同时运行时各自可见的数据以及彼此之间的互动程度。常见的隔离级别有读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
  4. 持久性(Durability):事务一旦提交,它对数据库中的数据变更就是永久性的,即使发生系统崩溃或电源故障等意外情况,数据库也能够保证已提交的事务不会丢失。持久性是通过将事务日志记录到磁盘或其他持久化介质来实现的。

这四个特性确保了事务的安全性、可靠性和一致性。它们是关系型数据库管理系统保证数据操作的基本要求,同时也是在设计应用程序时需要考虑和遵循的事务规范。
这四种特性中,只有隔离性(隔离级别)是可以设置的。

2. Spring中设置事务隔离级别

之前在MySQL中我们学过的事务隔离级别有四种.忘记的小伙伴可以查看:MySQL:索引事务.
此处我们要讲解的是Spring中的事务隔离级别,在 Spring 中,可以通过 @Transactional 注解的isolation属性来设置事务的隔离级别。isolation 属性接受一个枚举值,用于指定所需的隔离级别。

Spring中的事务隔离级别分为五种,分别是:

  1. DEFAULT:使用底层数据库的默认隔离级别。
  2. READ_UNCOMMITTED:读取未提交的数据。最低的隔离级别,在此级别下,一个事务可以读取到其他事务尚未提交的数据。
  3. READ_COMMITTED:读取已提交的数据。该级别下,一个事务只能读取到其他事务已经提交的数据,避免了脏读。
  4. REPEATABLE_READ:可重复读。在此级别下,事务开始时读取的数据集合将被固定,即使其他事务修改了数据,当前事务仍然看到最初读取的数据集合。防止了脏读和不可重复读。
  5. SERIALIZABLE:串行化。在此级别下,事务是按顺序一个接一个地执行,避免了脏读、不可重复读和幻读。

具体实现格式如下:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void doSomething() {// 事务操作
}

四. Spring事务传播机制

1. 事务传播机制

事务传播机制是指在多个事务操作嵌套执行时,各事务之间如何相互关联和影响的规则。

2. 为什么需要事务传播机制

事务传播机制的存在是为了**处理多个事务操作之间的关系和影响,以确保数据的一致性和完整性。**以下是一些需要事务传播机制的情况:

  1. 嵌套调用:当一个事务方法内部调用另一个事务方法时,事务传播机制可以控制这两个事务之间的关系。通过适当的传播行为配置,可以使内部方法加入当前事务、创建新的事务或以非事务方式执行,从而确保多个事务操作在正确的事务上下文中执行。
  2. 业务流程:在一个业务流程中可能涉及多个事务操作,比如订单处理过程中的库存扣减、支付确认和物流更新等。事务传播机制可以确保这些事务操作在合适的事务边界内进行,避免数据不一致的情况发生。
  3. 多线程并发:在多线程环境下,不同的线程可能同时执行事务操作。事务传播机制可以在并发执行的情况下维护事务的隔离性和原子性,避免数据冲突和并发问题。
  4. 异常处理:在事务中,如果出现异常,事务传播机制可以决定是继续传播异常还是回滚事务。通过配置合适的传播行为,可以在异常发生时采取适当的处理方式,以保证数据的一致性。

总之,事务传播机制允许我们在多个事务操作中控制事务的行为方式,确保数据的正确处理和一致性。通过合理配置事务传播行为,可以满足不同的应用场景下对事务处理的需求。
在这里插入图片描述
在这里插入图片描述

3. 事务传播机制有哪些

Spring框架提供了七种事务传播行为,用于控制事务方法的执行方式:
(包含例子:假设你正在计划一次旅行。你需要预订机票、酒店和租车,并确保这些操作在旅行期间的可用性和连贯性。)

  1. REQUIRED(默认):如果当前已经存在事务,则加入该事务中执行;如果当前没有事务,则创建一个新的事务。这是最常用的传播行为。

    当你预订机票时,系统首先检查目标航班的余票情况,然后从你的账户中扣除相应金额作为机票费用。如果你的预订操作已经在一个事务中,那么检查余票和扣款将加入到该事务中。如果没有事务,则创建一个新的事务来执行这两个操作。

  2. SUPPORTS:如果当前已经存在事务,则加入该事务中执行;如果当前没有事务,则以非事务方式执行。适合于不需要强制事务的场景。

    当你查询酒店房间的可用性时,系统根据你选择的日期和地点返回相关信息。如果你的 查询操作已经在一个事务中,那么查询房间可用性将加入到该事务中。如果没有事务,则以非事务方式执行查询。

  3. MANDATORY:如果当前已经存在事务,则加入该事务中执行;如果当前没有事务,则抛出异常。适合于必须依赖事务的场景。

    当你要修改预订的租车时间时,系统需要验证该租车订单是否存在。在租车订单修改方法中,通过判断当前是否存在事务来决定是否允许修改操作。如果你已经在事务中,则允许修改;如果没有事务,则抛出异常。

  4. REQUIRES_NEW:无论当前是否存在事务,都会挂起当前事务,创建一个新的事务执行。适合于需要独立的事务执行的场景。(事务挂起是指在执行一个事务的过程中,暂时中断该事务的执行,并将其保存在一个临时状态下,以便执行其他事务。当挂起的事务恢复执行时,会从挂起的点继续执行。)

    当你取消酒店预订时,需要先将预订状态设为取消,并返还预付款项。无论你当前是否处于一个事务中,这两个操作都将在一个新的事务中执行,并将原来的事务挂起。

  5. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将其挂起。适合于不需要事务支持的场景。

    当你查询机票价格时,系统根据出发地和目的地返回相关信息。如果你当前处于一个事务中,该查询操作将以非事务方式执行,而不会干扰原有事务的状态。

  6. NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。适合于不能在事务中执行的场景。

    当你申请旅行保险时,需要确保该操作不会在任何事务中执行。如果你当前处于一个事务中,则抛出异常并禁止执行保险申请操作,以确保操作的独立性。

  7. NESTED:如果当前已经存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。嵌套事务有自己的保存点,并可以回滚到保存点。适合于需要嵌套事务支持的场景。

    当你进行机票改签操作时,需要先将原机票设为无效,然后生成一张新的机票。如果你当前已经在一个事务中,那么这两个操作将在嵌套事务中执行,嵌套事务有自己的保存点,并可以回滚到保存点。如果没有事务,则创建一个新的事务来执行这两个操作。

例如:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {// 事务操作methodB();
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {// 事务操作
}

在上面的例子中,methodA()使用了默认的传播行为REQUIRED,如果当前存在事务,则methodB()将加入该事务;而methodB()使用了传播行为REQUIRES_NEW,无论当前是否存在事务,都将创建一个新的事务来执行。

通过选择合适的事务传播行为并进行配置,可以确保在多个事务操作中正确地管理事务的行为和关系,从而维护数据的一致性和完整性。

在这里插入图片描述
嵌套事务和加入事务的区别:
嵌套事务和加入事务都是事务传播机制的不同实现方式,它们之间有以下区别:

  1. 事务范围:
  • 嵌套事务是内部事务运行在外部事务的范围内,可以看作是外部事务的子事务,嵌套事务可以独立提交或回滚。
  • 加入事务是将一个方法或代码片段加入到已有的事务中,与外部事务共享同一个事务范围,不能单独提交或回滚。
  1. 事务行为:
  • 嵌套事务具有独立的事务保存点,可以在内部事务中进行回滚操作,而不会影响外部事务的状态。内部事务执行成功后,可以选择提交到外部事务或者继续嵌套使用。
  • 加入事务没有独立的事务保存点,它的所有操作都与外部事务绑定,只有外部事务提交时,才会将加入事务的操作一同提交。
  1. 使用场景:
  • 嵌套事务适用于需要在一个事务中执行多个独立的子操作,并且子操作可以单独回滚的情况。如果需要某个子操作的失败不会影响其他子操作,可以使用嵌套事务。
  • 加入事务适用于需要将一段代码或方法加入到已有事务中执行的情况,例如在一个服务方法中调用其他服务方法,希望它们共享同一个事务。通过加入事务,可以确保这些方法在一个事务中执行,并且要么都成功提交,要么都回滚。

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

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

相关文章

发生OOM时JVM会退出吗

程序是否退出和发生 OOM 无关 需要明确&#xff0c;程序是否退出和发生 OOM 无关&#xff0c;而和当前是否还有存活的非守护线程有关。 只要还有运行中的子线程&#xff0c;即使 main 线程结束或异常崩溃了&#xff0c;程序也不会停止。 public class TestThreadRun {privat…

sql:SQL优化知识点记录(十)

&#xff08;1&#xff09;慢查询日志 Group by的优化跟Order by趋同&#xff0c;只是多了一个having 开启慢查询日志&#xff1a; 演示一下慢sql&#xff1a;4秒之后才会出结果 查看一下&#xff1a;下方显示慢查询的sql &#xff08;2&#xff09;批量插入数据脚本 函数和存…

质量属性案例-架构真题(二十一)

试题一 某电子商务公司升级会员与促销管理系统&#xff0c;向用户提交个性化服务&#xff0c;提高用户粘性。在项目建立之初&#xff0c;公司领导人一致认为目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;用户简单&#xff0c;系统方面不需要做…

聊聊如何玩转spring-boot-admin

前言 1、何为spring-boot-admin&#xff1f; Spring Boot Admin 是一个监控工具&#xff0c;旨在以良好且易于访问的方式可视化 Spring Boot Actuators 提供的信息 快速开始 如何搭建spring-boot-admin-server 1、在服务端项目的POM引入相应的GAV <dependency><grou…

图神经网络和分子表征:4. PAINN

如果说 SchNet 带来了【3D】的火种&#xff0c;DimeNet 燃起了【几何】的火苗&#xff0c;那么 PAINN 则以星火燎原之势跨入 【等变】时代。 在 上一节 中&#xff0c;我们提到&#xff0c; PAINN 在看到 DimeNet 取得的成就之后&#xff0c;从另一个角度解决了三体几何问题&a…

无涯教程-Android - 系统架构

Android操作系统是一堆软件组件&#xff0c;大致分为五个部分和四个主要层&#xff0c;如体系结构图中所示。 Linux内核 底层是Linux-Linux 3.6&#xff0c;带有大约115个补丁&#xff0c;这在设备硬件之间提供了一定程度的抽象&#xff0c;并且包含所有必需的硬件驱动程序&am…

RK3568开发笔记(六):开发板烧写ubuntu固件(支持mipi屏镜像+支持hdmi屏镜像)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/132686096 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Sentinel 流量控制框架

1. Sentinel 是什么&#xff1f; Sentinel是由阿里中间件团队开源的&#xff0c;面向分布式服务架构的轻量级高可用流量控制组件。 2. 主要优势和特性 轻量级&#xff0c;核心库无多余依赖&#xff0c;性能损耗小。 方便接入&#xff0c;开源生态广泛。 丰富的流量控制场景。 …

AI篇-chatgpt基本用法(文心一言也适用)

目录 &#xff08;1&#xff09;基本规则 &#xff08;2&#xff09;例子1-文章摘要 &#xff08;3&#xff09;例子2-代码生成 &#xff08;4&#xff09;文心一言链接 &#xff08;1&#xff09;基本规则 相比于搜索引擎&#xff0c;ChatGPT的优势在于其高效的想法关联和…

《CTFshow-Web入门》09. Web 81~90

Web 入门 索引web81题解 web82题解原理 web83题解 web84题解 web85题解 web86题解 web87题解原理 web88题解 web89题解 web90题解 ctf - web入门 索引 web81&#xff1a;include() 利用&#xff0c;一句话木马之 Nginx 日志利用。web82~86&#xff1a;include() 利用&#xff…

WebSocket--技术文档--基本概念--《快速了解WebSocket协议》

阿丹&#xff1a; 不断学习新技术&#xff0c;丰富自己了解更多才能扩展更多世界可能。 官网 WebSocket首页、文档和下载 - HTML5开发相关 - OSCHINA - 中文开源技术交流社区 软件简介 WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebS…

力扣|找出和所对应的两数的下标

从零开始刷力扣&#xff08;bushi 题目放在这&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

linux上vscode中.cpp文件中引入头文件.hpp时报错:找不到头文件(启用错误钵形曲线)

当在.cpp文件中引入系统给定的头文件时&#xff1a;#include < iostream > 或者引入自定义的头文件 &#xff1a;#include <success.hpp> 报错&#xff1a;找不到相应的头文件&#xff0c;即在引入头文件的改行底下标出红波浪线 解决方法为&#xff1a; &#…

linux入门---动静态库的加载

目录标题 为什么会有动态库和静态库静态库的实现动态库的实现动静态库的加载 为什么会有动态库和静态库 我们来模拟一个场景&#xff0c;首先创建两个头文件 根据文件名便可以得知add.h头文件中存放的是加法函数的声明&#xff0c;sub.h头文件中存放的是减法函数的声明&#…

文章预览 安防监控/视频存储/视频汇聚平台EasyCVR播放优化小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

25 Linux可视化-Webmin和bt运维工具

25 Linux可视化-Webmin和bt运维工具 文章目录 25 Linux可视化-Webmin和bt运维工具25.1 Web运行环境简介25.2 Webmin的安装及使用25.2.1 安装webmin25.2.2 Webmin使用演示 25.3 bt(宝塔)的安装及使用25.3.1 安装宝塔25.3.2 宝塔Web登录Linux服务器25.3.3 找回宝塔登录密码 学习视…

Chrome 和 Edge 上出现“status_breakpoint”错误解决办法

文章目录 STATUS_BREAKPOINTSTATUS_BREAKPOINT报错解决办法Chrome浏览器 Status_breakpoint 错误修复- 将 Chrome 浏览器更新到最新版本- 卸载不再使用的扩展程序和应用程序- 安装计算机上可用的任何更新&#xff0c;尤其是 Windows 10- 重启你的电脑。 Edge浏览器 Status_brea…

iOS实时监控与报警器

在现代信息化社会中&#xff0c;即使我们不在电脑前面也能随时获取到最新的数据。而苹果公司提供的iOS推送通知功能为我们带来了一种全新的方式——通过手机接收实时监控和报警信息。 首先让我们了解一下iOS推送通知。它是一个强大且灵活可定制化程度高、适用于各类应用场景&a…

基于沙猫群算法优化的BP神经网络(预测应用) - 附代码

基于沙猫群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于沙猫群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.沙猫群优化BP神经网络2.1 BP神经网络参数设置2.2 沙猫群算法应用 4.测试结果&#xff1a;5.Matlab代…

论文研读|生成式跨模态隐写发展综述

前言&#xff1a;本文介绍近5年来生成式跨模态隐写领域的相关工作。 相关阅读&#xff1a;生成式文本隐写发展综述 不同于文本隐写&#xff0c;跨模态隐写需要考虑不同模态间的相关性&#xff0c;常见的跨模态场景有&#xff1a;Image-to-Text&#xff08;如图像描述&#xff…