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

Spring笔记(9):事务管理ACID

一、事务管理

一个数据库事务是一个被视为单一的工作单元操作序列。

事务管理有四个原则,被成为ACID

  • Atomicity 原子性—— 事务作为独立单元进行操作,整个序列是一体的,操作全都成功或失败。
  • Consistency 一致性—— 引用完整性的一致性,表中唯一的主键等。
  • Isolation 隔离性—— 每个事务同时处理时,事务之间不会干预
  • Durability 持久性 事务一旦完成,结果是不可逆的,不会因为故障而失效

那么一个关系型数据库将保证事务有这四个原则。

使用SQL发布到数据库中的事务简单视图如下:

  • 使用begin transaction命令开始事务
  • 使用SQL查询语句执行更新操作
  • 如果操作都成功,则提交操作,否则回滚操作

Spring 事务支持

  • Spring框架在不同底层事务管理API的顶部提供了一个抽象层。
  • Spring事务支持主要通过添加事务能力到POJO来提供EJB事务。
  • Spring支持编程式和声明式事务管理。
  • EJB需要一个应用程序服务器,但Spring事务管理可以不需要应用程序服务器。

全局事务与局部事务

  • 局部事务?

它是一个特定单一事务资源,例如一个JDBC连接。

若你的生产环境是集中的,该环境中的程序组件和资源位于一个位置,而事务管理只涉及到一个运行
单一机器中的本地数据管理器,则适用局部事务。

  • 全局事务?

它可以跨多个事务资源,如一个分布式系统中的事务。

若你的生产环境是分散的,所有资源分布在多个系统中,则需要局部事务和全局事务管理。
分布式或全局事务跨多个系统执行,它的执行需要全局事务管理系统和所有相关系统的局部数据管理人员之间的协调。

编程式与声明式事务管理

  • 编程式事务管理: 用编程的方式进行事务管理,灵活性较高,但维护性差。
  • 声明式事务管理: 从业务代码中分离事务管理,仅使用注释或XML配置来管理事务。

声明式事务管理比编程式事务管理更适合,它可以使用AOP方法进行模块化,Spring AOP框架也可以用来进行声明式事务管理。

Spring事务抽象

Spring事务管理的五大属性:隔离级别传播行为只读属性事务超时回滚规则

隔离级别

  • 默认: TransactionDefinition.ISOLATION_DEFAULT
  • 读取提交内容: TransactionDefinition.ISOLATION_READ_COMMITTED
    能阻止误读,可发生不可重复读和虚读。
  • 读取未提交内容: TransactionDefinition.ISOLATION_READ_UNCOMMITTED
    可以发生误读、不可重复读和虚读。
  • 可重读内容: TransactionDefinition.ISOLATION_REPEATABLE_READ
    表明能够阻止误读和不可重复读;可以发生虚读。
  • 可串行化: TransactionDefinition.ISOLATION_SERIALIZABLE
    表明能够阻止误读、不可重复读和虚读。

传播行为

  • 支持当前事务:
    TransactionDefinition.PROPAGATION_MANDATORY
  • 支持当前事务,在嵌套事务执行:
    TransactionDefinition.PROPAGATION_NESTED
  • 不支持当前事务:
    TransactionDefinition.PROPAGATION_NEVER
  • 不支持当前事务,总是执行非事务性: TransactionDefinition.PROPAGATION_NOT_SUPPORTED
  • 支持当前事务,若不存在则创建新事务:
    TransactionDefinition.PROPAGATION_REQUIRED
  • 创建新事务,将当前事务挂起:
    TransactionDefinition.PROPAGATION_REQUIRES_NEW
  • 支持当前事务,若不存在则执行非事务性:
    TransactionDefinition.PROPAGATION_SUPPORTS
  • 使用默认超时底层事务系统,若不支持超时则没有传播行为:
    TransactionDefinition.TIMEOUT_DEFAULT

事务抽象

Spring事务抽象由org.springframework.transaction.PlatformTransactionManager接口定义。

public interface PlatformTransactionManager{//根据传播行为,返回当前活动事务或创建新事务TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;//提交事务以及事务状态void commit(TransactionStatus status) throws TransactionException;//执行事务回滚void rollback(TransactionStatus status) throws TransactionException;
}

TransactionDefinition接口是Spring事务支持的核心接口,定义如下:

public interface TransactionDefinition{int getPropagationBehavior();	//获取传播行为int getIsolationLevel();	//获取隔离级别String getName(); //获取事务名称int getTimeout();	//获取事务超时时间boolean isReadOnly();	//获取只读属性
}

TransactionStatus接口为事务代码提供简单方法来控制事务执行和查询事务状态。

public interface TransactionStatus extends SavepointManager{boolean isNewTransaction();	//是否为新事务boolean hasSavepoint();	//该事务内部是否有一个保存点,也就是说,基于一个保存点已经创建了嵌套事务。void setRollbackOnly();	//该方法设置该事务为 rollback-only 标记。boolean isRollbackOnly();	//该事务是否已标记为 rollback-only。boolean isCompleted();	//事务是否已经提交或回滚。
}

二、编程式事务管理

我们尝试一下如何进行编程式事务管理。
步骤一:添加依赖包

  • jdbc.jar
  • mysql-connector.jar
  • transaction.jar

pom.xml

		<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.23</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.24</version></dependency>

步骤二:创建POJO类

User.java

public class User{private Integer id;private String name;private Integer age;private Integer marks;private Integer year;private Integer sid;public User() {}public User(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public User(Integer id, String name, Integer age, Integer marks, Integer year, Integer sid) {this.id = id;this.name = name;this.age = age;this.marks = marks;this.year = year;this.sid = sid;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getMarks() {return marks;}public void setMarks(Integer marks) {this.marks = marks;}public Integer getYear() {return year;}public void setYear(Integer year) {this.year = year;}public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", marks=" + marks +", year=" + year +", sid=" + sid +'}';}
}

步骤三:创建dao层

UserDao.java

public interface UserDao {public void setDataSource(DataSource ds);public void create(String name,Integer age,Integer marks,Integer year);public List<User> listUsers();
}

步骤四:创建Mapper层

UserMapper.java

public class UserMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {return new User(rs.getInt("id"),rs.getString("name"),rs.getInt("age"), rs.getInt("marks"),rs.getInt("year"),rs.getInt("sid"));}
}

步骤五:创建Template层

UserJdbcTemplate.java

public class UserJdbcTemplate implements UserDao {private DataSource dataSource;private JdbcTemplate jdbcTemplate;private PlatformTransactionManager platform;private String sql;public void setPlatform(PlatformTransactionManager platform) {this.platform = platform;}@Overridepublic void setDataSource(DataSource ds) {this.dataSource = ds;this.jdbcTemplate = new JdbcTemplate(dataSource);}@Overridepublic void create(String name, Integer age, Integer marks, Integer year) {TransactionDefinition definition = new DefaultTransactionDefinition();TransactionStatus status = platform.getTransaction(definition);try {sql = "insert into user (name,age) values(?,?)";jdbcTemplate.update(sql,name,age);sql = "select max(id) from user";int sid = jdbcTemplate.queryForInt(sql,null,Integer.class);sql = "insert into marks(sid,marks,year) values (?,?,?)";jdbcTemplate.update(sql,sid,marks,year);System.out.println("提交");platform.commit(status);}catch (DataAccessException e){System.out.println("Error in creating record,rolling back");platform.rollback(status);throw e;}return;}@Overridepublic List<User> listUsers() {sql = "select * from user u,marks m where u.id = m.sid";return jdbcTemplate.query(sql,new UserMapper());}}

步骤六:bean配置

jdbc.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><bean id="userJDBCTemplate" class="org.example.Template.UserJdbcTemplate"><property name="dataSource" ref="dataSource" /><property name="platform" ref="transactionManager" /></bean>

输出结果

回滚事件:

------Records creation--------
Error in creating record,rolling back
Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [select max(id) form user]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'user' at line 1at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541)at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:393)at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:465)at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:475)at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:508)at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:515)at org.example.Template.UserJdbcTemplate.create(UserJdbcTemplate.java:46)at org.example.Main.main(Main.java:26)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'user' at line 1at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.Util.getInstance(Util.java:408)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2491)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2449)at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1381)at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:452)at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:381)... 6 more

三、声明式事务管理

我们来尝试一下声明式事务管理
这里展示与编程式事务管理的不同的地方。

1、Template类不再有PlatformTransactionManager参与,即正常的JDBC框架内容。
2、配置文件jdbc.xml,声明tx命名空间,aop命名空间,装配事务管理和面向切面配置

jdbc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- 初始化数据库连接池 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/TEST"/><property name="username" value="root"/><property name="password" value="123456"/></bean>##AOP框架中实际调用的方法<tx:advice id="txAdvice"  transaction-manager="transactionManager">##目标<tx:attributes>##锚定方法<tx:method name="create"/></tx:attributes></tx:advice>##配置aop框架,设置切入点,加载advice<aop:config><aop:pointcut id="createOperation" expression="execution(* com.tutorialspoint.StudentJDBCTemplate.create(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="createOperation"/></aop:config>##初始化事务管理器<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource"  ref="dataSource" />    </bean>#初始化template<bean id="studentJDBCTemplate"  class="com.tutorialspoint.StudentJDBCTemplate"><property name="dataSource"  ref="dataSource" />  </bean></beans>

相关文章:

Spring笔记(9):事务管理ACID

一、事务管理 一个数据库事务是一个被视为单一的工作单元操作序列。 事务管理有四个原则&#xff0c;被成为ACID&#xff1a; Atomicity 原子性—— 事务作为独立单元进行操作&#xff0c;整个序列是一体的&#xff0c;操作全都成功或失败。Consistency 一致性—— 引用完整…...

io流 知识点+代码实例

需求 : 如何实现读写文件内部的内容?流 : 数据以先入先出的方式进行流动相当于管道,作用用来传输数据数据源-->流-->目的地流的分类 :流向分 : 以程序为中心输入流输出流操作单元 :字节流 : 万能流字符流 : 只能操作纯文本文件功能分 :节点流 : 真实实现读写的功能流(包…...

【MySQL】P8 多表查询(2) - 连接查询 联合查询

连接查询以及联合查询多表查询概述连接查询内连接隐式内连接显式内连接外连接左外连接右外连接自连接联合查询多表查询概述 建表语句见上一篇博文&#xff1a;https://blog.csdn.net/weixin_43098506/article/details/129402302 e.g.e.g.e.g. select * from emp, dept where e…...

QML动画(Animator)

在Qt5.2之后&#xff0c;引入Animator动画元素。这种方式可以直接所用于Qt Quick的场景图形系统&#xff0c;这使得基于Animator元素的动画及时在ui界面线程阻塞的情况下仍然能通过图形系统的渲染线程来工作&#xff0c;比传统的基于对象和属性的Animation元素能带来更好的用户…...

Git 分支操作【解决分支冲突问题】

1. 什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候&#xff0c;不会影响主线分支的运行。对于初学…...

盘点全球10大女性技术先驱

盘点全球10大女性技术先驱 人们普遍认为技术是男性主导的领域&#xff0c;但事实&#xff0c;技术或编程与性别无关&#xff0c;几乎任何人都可以成为技术大神。已经有很多案例证明女性同样可以在技术领域施展才能。在女神节来临之际&#xff0c;我为大家盘点一下为编程做出卓越…...

C++之dynamic_cast

C之dynamic_cast前言dynamic_castNote:示例:前言 dynamic_cast运算符牵扯到的面向对象的多态性跟程序运行时的状态&#xff0c;所以不能完全的使用传统的转换方式来替代。因此是最常用&#xff0c;最不可缺少的一个运算符&#xff0c;与static_cast一样&#xff0c;dynamic_cas…...

JavaScript 箭头函数、函数参数

箭头函数&#xff1a; 箭头函数是一种更加简洁的函数书写方式箭头函数本身没有作用域&#xff08;无this&#xff09;箭头函数的this指向上一层&#xff0c;上下文决定其this基本语法&#xff1a;参数 > 函数体 a. 基本用法 let fn v > v; //等价于 let fn function(…...

JavaScript_Object.keys() Object.values()

目录 一、Object.keys() 二、Object.values() 一、Object.keys() Object.keys( ) 的 用法 : 作用 &#xff1a;遍历对象 { } 返回结果&#xff1a;返回 对象中 每一项 的 key 值 返回值 : 是一个 *** [ 数 组 ] *** 例子 ( 1 ) : <script>// 1. 定义一个对象var obj …...

扬帆优配|高送转+高分红+高增长潜力股揭秘

高送转且高分红的高增加股票&#xff0c;有望跑赢大盘。 此前七连阴的泽宇智能&#xff0c;今日早盘大幅高开。到上午收盘&#xff0c;该股飙涨9.3%&#xff0c;位居涨幅榜前列。音讯面上&#xff0c;3月7日晚间&#xff0c;泽宇智能发表2022年年报&#xff0c;年报显现&#x…...

基于transformer的多帧自监督深度估计 Multi-Frame Self-Supervised Depth with Transformers

Multi-Frame Self-Supervised Depth with Transformers基于transformer的多帧自监督深度估计0 Abstract 多帧深度估计除了学习基于外观的特征外&#xff0c;也通过特征匹配利用图像之间的几何关系来改善单帧估计。我们采用深度离散的核极抽样来选择匹配像素&#xff0c;并通过一…...

设计模式: 单例模式

目录单例模式应用场景实现步骤涉及知识点设计与实现单例模式 通过单例模式的方法创建的类在当前进程中只有一个实例&#xff1b; 应用场景 配置管理 日志记录 线程池 连接池 内存池 对象池 消息队列 实现步骤 将类的构造方法定义为私有方法 定义一个私有的静态实例 提供一…...

idea编辑XML文件出现:Tag name expected报错

说明 Tag name expected解释其实就是&#xff1a;需要标记名称&#xff0c;也就是符号不能直接使用的意思 XML (eXtensible Markup Language) 是一种标记语言&#xff0c;用于存储和传输数据。在 XML 中&#xff0c;有些字符被视为特殊字符&#xff0c;这些字符在 XML 中具有…...

第十三届蓝桥杯省赛C++ A组 爬树的甲壳虫(简单概率DP)

题目如下&#xff1a; 思路 or 题解&#xff1a; 概率DP 状态定义&#xff1a; dp[i]dp[i]dp[i] 表示从树根到第 iii 层的期望 状态转移&#xff1a; dp[i](dp[i−1]1)∗11−pdp[i] (dp[i - 1] 1) * \frac{1}{1-p}dp[i](dp[i−1]1)∗1−p1​ 这个式子的意思是&#xff1a;…...

手动集成Tencent SDK遇到的坑!!!

手动集成的原因 由于腾讯未把Tencent SDK上传到Github中&#xff0c;所以我们不能通过Cocoapods的方式集成&#xff0c;只能通过官方下载其SDK手动集成。 Tencent SDK手动集成步骤 1.访问腾讯开放平台SDK下载界面&#xff0c;找到并下载iOS_SDK_V3.5.1。&#xff08;目前最新…...

三天吃透mybatis面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

SpringBoot整合Quartz以及异步调用

文章目录前言一、异步方法调用1、导入依赖2、创建异步执行任务线程池3、创建业务层接口和实现类4、创建业务层接口和实现类二、测试定时任务1.导入依赖2.编写测试类&#xff0c;开启扫描定时任务3.测试三、实现定时发送邮件案例1.邮箱开启IMAP服务2.导入依赖3.导入EmailUtil4.编…...

Golang 中 Slice的分析与使用(含源码)

文章目录1、slice结构体2、slice初始化3、append操作4、slice截取5、slice深拷贝6、值传递还是引用传递参考文献众所周知&#xff0c;在golang中&#xff0c;slice&#xff08;切片&#xff09;是我们最常使用到的一种数据结构&#xff0c;是一种可变长度的数组&#xff0c;本篇…...

瀑布开发与敏捷开发的区别,以及从瀑布转型敏捷项目管理的5大注意事项

事实证明&#xff0c;瀑布开发管理模式并不适合所有的软件项目&#xff0c;但敏捷项目管理却对大多数项目有效。那么当团队选择转型敏捷的时候有哪些因素必须注意&#xff1f;敏捷开发最早使用者大多是小型、独立的团队&#xff0c;他们通常致力于小型、独立的项目。正是他们的…...

“华为杯”研究生数学建模竞赛2007年-【华为杯】A题:建立食品卫生安全保障体系数学模型及改进模型的若干理论问题(附获奖论文)

赛题描述 我国是一个拥有13亿人口的发展中国家,每天都在消费大量的各种食品,这批食品是由成千上万的食品加工厂、不可计数的小作坊、几亿农民生产出来的,并且经过较多的中间环节和长途运输后才为广大群众所消费,加之近年来我国经济发展迅速而环境治理没有能够完全跟上,以…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...