Spring笔记(五)
Spring 事务操作
一、事务(概念)
1. 什么是事务
- 事务是数据库的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败,那么所有的操作都失败
- 典型场景:
- lucy转账100元给mary
- lucy少100元,mary多100元
2. 事务的四个特性(ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
二、事务操作
1. Spring事务管理介绍
事务添加到JavaEE三层结构里面Service层(业务逻辑层)
在Spring进行事务管理操作
- 编程式事务管理:就是在代码中编写代码,手动开启事务
- 声明式事务管理:面向切面配置事务,开启事务
声明式事务管理
- 基于注解方式(使用)
- 基于xml配置文件方式
在Spring进行声明式事务管理,底层使用AOP原理
Spring事务管理API
提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

2. 注解声明式事务管理
在Spring配置文件配置事务管理器
<!-- 创建事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
在Spring配置文件,开启事务注解
在spring配置文件引入名称空间tx
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
开启事务注解
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
在service类什么(或者service类里面的方法上面)添加事务注解
@Transaction,这个注解添加到类上面,也可以添加方法上面
如果把这个注解添加到类上面,这个类里面多有的方法都添加事务
如果把这个注解添加到方法上面,那么只是为这个方法添加事务
@Service
@Transaction
public class UserService {
...
}
3. 声明式事务管理参数配置
在service类声明添加注解@Transaction,这个注解里面可以配置事务相关参数

propagation:事务传播行为
事务传播行为:多事务方法直接进行调用,这个过程中事务是如何进行管理的
事务方法:对数据库表的书籍进行变化的操作

Spring框架事务传播行为有7种,重点掌握
REQUIRED和REQUIRES_NEWREQUIRED:如果add方法本身有事务,调用update方法后,update使用当前add方法里面的事务;如果add方法本身没有事务,那么调用update方法之后,创建新事务
REQUIRES_NEW:使用add方法调用update方法,无论add方法是否有事务,update都要创建新事务,如果add方法的事务正在运行,那么update方法的事务要先挂起

isolation:事务隔离级别
- 事务有特性成为隔离性,多事务之间操作不会产生影响。如果不考虑隔离性则会产生很多问题
- 有三个问题:脏读、不可重复读、幻读
- 脏读:在一个事务种读取到另一个未提交事务的数据

- 不可重复读:在一个事务种,两次查询到的结果不一致(针对update操作)

幻读:在一个事务种,两次查询到的结果不一致(针对insert操作)
如何解决这些问题?
通过设置事务隔离级别,解决读问题
SQL标准的事务隔离级别包括:读未提交、读提交、可重复读(MySQL中默认)、串行化
- 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到
- 读已提交:一个事务提交之后,它做的变更才能被其他事务看到
- 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的
- 串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出像读写锁冲突时候,后访问的事务必须等前一个事务执行完成,才能继续执行

timeout:超时时间
- 事务需要在一定的时间内进行提交,如果不提交则进行回滚
- 默认值是-1,设置时间以秒单位进行计算
readOnly:是否只读
- 读:查询操作 写:添加、修改、删除
- readOnly默认值是false,表示可以读,也可以写
- readOnly设置成true,只能进行读操作,即查询
rollbaclFor:回滚
- 设置出现哪些异常进行事务回滚
noRollbackFor:不回滚
- 设置出现哪些异常不进行事务回滚
4. XML声明式事务管理
在Spring配置文件中进行配置
配置事务管理器
<!-- 1. 创建事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
配置通知
<!-- 2. 配置通知 -->
<tx:advice id="txadvice">
<!-- 配置事务参数 -->
<tx:attributes>
<tx:method name="accountMoney" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
配置切入点和切面
<!-- 3. 配置切入点和切面 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>
5. 完全注解声明式事务管理
创建配置类
@Configuration // 配置类
@ComponentScan(basePackages = "com.atguigu") // 开启组件扫描
@EnableTransactionManagement // 开启事务
public class TxConfig { @Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/spring");
druidDataSource.setUsername("root");
druidDataSource.setPassword("16887988hhh."); return druidDataSource;
} // 创建JdbcTemplate对象
@Bean(value = "jdbcTemplate")
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate;
} // 创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager;
}
}
Spring笔记(五)的更多相关文章
- Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)
Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 《MFC游戏开发》笔记五 定时器和简单动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Crazyflie笔记五: CRTP 实时通信协议(一)(转)
源:Crazyflie笔记五: CRTP 实时通信协议(一) 这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述.这里是第一节内容.欢迎交流:301 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Spring笔记02_注解_IOC
目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...
- Spring笔记01_下载_概述_监听器
目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- js 深入原理讲解系列-currying function
js 深入原理讲解系列-currying function 能看懂这一题你就掌握了 js 科里函数的核心原理 不要专业的术语,说人话,讲明白! Q: 实现 sum 函数使得以下表达式的值正确 cons ...
- Github Actions All In One
Github Actions All In One https://github.com/features/actions https://github.com/marketplace?type=ac ...
- LeetCode 刷题 App / LeetCode 题解 App
LeetCode 刷题 APP / LeetCode 题解 App 全端支持 http://leetcode-app.xgqfrms.xyz/ http://leetcode-desktop.xgqf ...
- 智能货柜 & 技术原理 (动态视觉识别 + 重力感应)
智能货柜 & 技术原理 (动态视觉识别 + 重力感应) 智能货柜 拥有智能化.精细化运营模式的智能货柜成为代替无人货架继前进的方式. 相比无人货架来说,智能货柜的技术门槛更高,拥有 RFID. ...
- iPad Pro 如何通过 USB-C 接口外接机械键盘
iPad Pro 如何通过 USB-C 接口外接机械键盘 外接机械键盘 Type-C Dock OK,cnblogs 图片文件不能超过20M https://support.apple.com/zh- ...
- SSR & 轮询登录 & Token
SSR & 轮询登录 & Token https://yuchengkai.cn/docs/frontend 扫码登录原理 https://www.cnblogs.com/xgqfrm ...
- NGK.IO的智能合约是炒作还是未来商业的主流?
随着NGK主网的上线,NGK市场也备受关注.目前,NGK代币价格已经由初始价格0.0215美元涨到现在的0.86美元,代币价格上涨40倍!数字货币市场也已经将重点目光放到了NGK代币上,相信在不久的将 ...
- django学习-2.urls.py和view.py的相关知识点
1.URL函数简单解析 1.1.url() 函数可以接收四个参数,分别是两个必选参数:regex.view,和两个可选参数:kwargs.name. def url(regex, view, kwar ...
- Python学习笔记_斐波那契数列
""" 1.生成100项斐波那契数列 2.求第n项斐波那契数列的值是多少 3.给定终止值,生成此前斐波那契数列 """ # 求第n项斐波那契 ...
- 如何用python自动编写《赤壁赋》word文档
目录 前言 安装-python-docx 一.自动编写<赤壁赋> 准备数据 新建文档 添加标题 添加作者 添加朝代 添加图片 添加段落 保存word文档 二.自动提取<赤壁赋> ...