当前位置: 首页 > 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亿人口的发展中国家,每天都在消费大量的各种食品,这批食品是由成千上万的食品加工厂、不可计数的小作坊、几亿农民生产出来的,并且经过较多的中间环节和长途运输后才为广大群众所消费,加之近年来我国经济发展迅速而环境治理没有能够完全跟上,以…...

基于JavaWeb学生选课系统开发与设计(附源码资料)

文章目录1. 适用人群2. 你将收获3.项目简介4.技术实现5.运行部分截图5.1.管理员模块5.2.教师模块5.3.学生模块1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计或者是需要实战项目的Java开发学习者。 2. 你将收获 提供&#xff1a;项目源码、项目文档、数据库脚本…...

centos7 oracle19c安装||新建用户|| ORA-01012: not logged on

总共分三步 1.下载安装包:里面有一份详细的安装教程 链接&#xff1a;https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码&#xff1a;8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…...

【算法设计-分治】递归与尾递归

文章目录1. 阶乘尾递归&#xff1a;递归的进一步优化2. 斐波那契数列3. 最大公约数&#xff08;GCD&#xff09;4. 上楼梯5. 汉诺塔&#xff08;1&#xff09;输出移动过程输出移动步数5. 汉诺塔&#xff08;2&#xff09;输出移动过程输出移动步数6. 杨辉三角形7. 完全二叉树1…...

HTML 编辑器

文章目录 HTML 编辑器HTML 编辑器推荐编辑器下载网站HBuilder步骤 1: 新建 HTML 文件步骤 2: 另存为 HTML 文件步骤 3: 在浏览器中运行这个 HTML 文件HTML 编辑器 HTML 编辑器推荐 可以使用专业的 HTML 编辑器来编辑 HTML,我为大家推荐几款常用的编辑器: Notepad++:Windows…...

css盒模型详解

一、引言 盒模型是网页开发中的一个基本概念&#xff0c;它描述了网页元素的外观和大小。盒模型由内容区域、内边距、边框和外边距四个部分组成&#xff0c;这些部分的大小和位置都可以通过CSS进行控制。在本文中&#xff0c;我们将介绍盒模型的概念和作用&#xff0c;并提出本…...

函数模板(template关键字的应用)

注释&#xff1a;本文主要介绍了函数模板的由来以及用法&#xff0c;还有关键字template。 我们感到时间的延续像一条我们无法逆行的小溪。 ——柏格森 文章目录一、语言的定式二、函数模板2.1 函数模板格式2.2 模板函数的实例化2.2.1隐式实例化/显式实例化2.3 模板参数的匹配…...

嵌入式学习笔记——使用寄存器编程操作GPIO

使用寄存器编程操作GPIO前言GPIO相关的寄存器GPIO 端口模式寄存器 (GPIOx_MODER) (x A..I)位操作GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A..I)GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A..I/)GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A..I/)GPIO 端口输入数据寄…...

图像的读取与保存

图像是由一个个像素点组成&#xff0c;像素点就是颜色点&#xff0c;而颜色最简单的方式就是用RGB或RGBA表示图像保存图像将像素信息按照 一定格式&#xff0c;一定顺序&#xff08;即编码&#xff09; 存在硬盘上的 二进制文件 中保存图像需要以下必要信息&#xff1a;1. 文件…...

【蓝桥杯集训·每日一题】AcWing 4074. 铁路与公路

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴Floyd 算法Spfa 算法一、题目 1、原题链接 4074. 铁路与公路 2、题目描述 某国家有 n 个城市&#xff08;编号 1∼n&#xff09;和 m 条双向铁路。 每条铁路连接两个不同的…...

网络:TCP与UDP相关知识(详细)

目录&#xff1a;1、UDP 和 TCP 的特点与区别2、UDP 、TCP 首部格式3、TCP 的三次握手和四次挥手4、TCP 的三次握手&#xff08;为什么三次&#xff1f;&#xff09;5、TCP 的四次挥手&#xff08;为什么四次&#xff1f;&#xff09;6、TCP 长连接和短连接的区别7、TCP粘包、拆…...

长沙网站建设建/百度客服人工电话24

文章目录问题背景问题分析问题解决问题背景 web项目中&#xff0c;Driver驱动类路径正确&#xff0c;且导入的依赖正确&#xff0c;但仍报错。 问题分析 在web项目中&#xff0c;单元测试时&#xff0c;业务层与数据库可以正常交互 但部署了Tomcat服务器后&#xff0c;在本地…...

花生壳怎么发布自己做的网站/短视频询盘获客系统

在xml 文件里定义控件的属性&#xff0c;我们已经习惯了android:attrs"" ,那么我们能不能定义自己的属性能&#xff0c;比如:test:attrs"" 呢&#xff1f;答案是肯定的. 一、在res/values文件下定义一个attrs.xml文件.代码如下: <?xml version&qu…...

申请网站域名多少钱/网络营销培训机构

客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单。 在AngularJS中&#xff0c;有许多表单验证指令。在这里&#xff0c;我们将谈谈几个最流行指令&#xff0c;然后我们将讨论如何编写自定义的验…...

网站备案跟做哪个推广有关系吗/中国网络营销公司排名

[转]Python正则表达式中匹配GBK/UTF-8编码中文字符_绝冬之地_百度空间[转]Python正则表达式中匹配GBK/UTF-8编码中文字符2009年10月14日 14:21Python的正则表达式匹配和源代码编码相同的中文字符 如果源代码为GBK&#xff0c;则对于UTF-8编码中文字符无法匹配 如果源代码为UTF-…...

python做网站的开发/百度怎么做广告

pg中删除表中记录后&#xff0c;通过vacuum命令可以回收那些dead tulpe占用的空间。那么vacuum具体是怎么回收空间的呢&#xff1f;空间回收之后会影响原先表上索引的正常使用吗&#xff1f; 要弄清楚这些问题&#xff0c;我们那首先要知道在pg中heap page内部的空间分配是什么…...

搭建房子流程/优化服务

实验内容&#xff1a;1&#xff0e; 学习Javascript事件处理2&#xff0e; 掌握Javascript内置对象和函数的应用实验步骤&#xff1a;1.JavaScript函数函数在定义时并没有被执行&#xff0c;只有函数被调用时&#xff0c;其中的代码才真正被执行。为了实现函数的定义和调用&…...