Spring实战(十三)Spring事务
1、什么是事务(Transaction)?
事务是指逻辑上的一组操作,要么全部成功,要么全部失败。
事务是指将一系列数据操作捆绑成为一个整体进行统一管理。如果某一事务执行成功,则该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误必须取消或者回滚,则数据将全部恢复到操作前的状态,所有的数据的更改均被消除。
2.事务的特性
原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:事务前后的数据的完整性必须保持一致。
隔离性:多个用户并发访问数据库,一个用户的事务的执行不能被其他事务干扰,多个并发事务之间的数据要相互隔离。
持续性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,即使数据库发生故障也不应该有任何影响。
3.事务并发操作带来哪些问题?
丢失修改:两个事务T1和T2读入同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。
脏读:一个事务读取了另一个事务改写但还未提交的数据,若这些事务被回滚,这个读取就是无效的。
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同(读时数据发生了改变)。
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,发生幻读。后来的查询中,第一个事务发现一些原来没有的记录。
4、Spring事务管理API(主要有3个)
PlatformTransactionManager:事务管理器;
TransactionDefinition:事务的定义信息(隔离,传播,超时,只读);
TransactionStatus:保存事务具体运作状态
5、PlatformTransactionManager 事务管理器
spring为不同的持久化框架提供了不同的PlatformTransactionManager。
不论 采用何种方式,都必须先创建“事务管理器”的对象。
6、TransactionDefinition 定义事务(隔离,传播,超时,只读)
设置隔离级别:(一组常量定义)
(mysql 默认REPEATABLE_READ、oracle默认 READ_COMMITTED)
定义事务的传播行为
应用场景:当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务环境中,Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个完整的业务操作,因此就会产生服务接口方法嵌套调用的情况, Spring通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
(当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,并且实现者需要支持保存点事务机制。)
事务传播行为类型 |
说明 |
PROPAGATION_REQUIRED |
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS |
支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY |
使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW |
新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED |
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER |
以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED |
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
此外,还有超时时间、是否只读等相关功能。
7、TransactionStatus:保存事务状态
接口提供了一些方法来判断(获得)事务当前的状态:
void flush();冲洗数据库底层会话
boolean hasSavePoint();返回该事务是否有一个保存点
boolean isCompleted();返回事务是否提交或者回滚
boolean isNewTransaction();返回是否是一个新事务
boolean isRollbackOnly();判断这个事务是否已经设置了rollback-only。
void setRollbackOnly();设置这个事务rollback-only。
8、嵌套事务
嵌套是子事务套在父事务中执行,子事务是父事务的一部分。
在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务。这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。重点就在于那个save point,看几个问题就明白了。
如果子事务回滚,会发生什么?
父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。
如果父事务回滚,会发生什么?
父事务回滚,子事务也会跟着回滚!为什么呢,因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。
那么:事务的提交,是什么情况? 是父事务先提交,然后子事务提交,还是子事务先提交,父事务再提交?
答案是第二种情况,还是那句话,子事务是父事务的一部分,由父事务统一提交。
9、Spring支持两种方式事务管理
——编程式的事务管理
- 实际开发中很少应用
- 通过TransactionTemplate手动管理事
——使用XML配置声明事务
- 开发中推荐使用(代码侵入性最小)
- Spring的声明式事务是通过AOP实现
10、声明式事务管理——XML配置(AOP思想)
step-01 配置事务管理器——注入dataSource,确定对哪个数据库操作;
step-02 配置事务的增强——要做的事务操作,确定进行事务操作的方法匹配规则。(隔离级别、哪个方法进行事务)
step-03 配置切面——把通知应用到切点。
11、声明式事务管理——注解配置
step-01 配置事务管理器——注入dataSource,确定对哪个数据库操作;
step-02 开启事务注解;
step-03 在要使用事务的方法所在类上面添加注解@Transactional。
参考:http://opiece.me/2016/03/18/spring-transactional-introduce/
转载于:https://www.cnblogs.com/bigbigbigo/p/8383272.html
Spring实战(十三)Spring事务相关推荐
- 【Spring实战】----Spring事务管理配置解析
上篇说了aop的配置,并且说了Spring事务管理是基于aop的,那么Spring声明式事务的配置就有两种方式:XML配置及注解配置 不多说,直接看配置文件 一.配置文件 applicationCon ...
- Java高级编程架构——Spring实战:Spring初探
主要内容 Spring的使命--简化Java开发 Spring容器 Spring的整体架构 Spring的新发展 现在的Java程序员赶上了好时候.在将近20年的历史中,Java的发展历经沉浮.尽管有 ...
- Spring实战(Spring起步)
Spring起步 什么是Spring 初始化Spring应用 pom文件 启动类 测试类 编写spring应用 控制器 视图 测试 了解Spring Boot DevTools 回顾 俯瞰Spring ...
- Spring实战之Spring动态加载jar模块和卸载模块
加载 Spring提供了下面这些类来加载外部jar. classPathResorce可以用来加载类路径上的jar. 一般推荐使用 classLoader = new UrlClassLoader(n ...
- spring实战学习(六)事务管理
什么是事务? 在软件领域,我们将一组要么全部执行要么全不执行的操作叫做事物. 事务的四个特性(ACID) 原子性(atomicity):原子性确保了事物中的操作像原子操作一样要就全部执行或全不执行,如 ...
- Spring实战(第3版)
<Spring实战(第3版) > 基本信息 原书名:Spring in Actiong(third edition) 作者: (美)Craig Walls 译者: 耿渊 张卫滨 出版社:人 ...
- 《spring实战第四版》的读书笔记
<spring实战第四版>的读书笔记 1 概述 <Spring实战第四版>描述了Spring4架构的设计,看完了以后,最大感觉是Spring的IOC与aop理念实在是太强大了, ...
- Spring实战6-利用Spring和JDBC访问数据库
主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...
- Spring实战——缓存
缓存 提到缓存,你能想到什么?一级缓存,二级缓存,web缓存,redis-- 你所能想到的各种包罗万象存在的打着缓存旗号存在的各种技术或者实现,无非都是宣扬缓存技术的优势就是快,无需反复查询等. 当然 ...
最新文章
- Asp.NET中常用的一些优化性能的方法
- Spring思维导图(MVC篇)
- linux 2.6.35 arm map_lowmem,第一次玩arm和linux,9261移植2.6.39无法挂载jiffys2文件系统,谁能指点一下...
- 13、logging模块
- 云梦天气预报软件测试,云梦天气预报15天
- jvm需要多长时间才能进行转义分析? 可能比您想象的要长。
- go 语言链接服务器上的mysql数据库
- 背景图页面缩小会变形_社团招新迎新海报背景图第321期
- 剑指offer——python【第54题】字符流中第一个不重复的字符
- warning: C4819的解决办法
- Android-你真的懂AIDL的oneway嘛?
- ECE8.1认证之路
- 神经网络算法和人工智能,神经网络的算法有哪些
- PO模式实现Appium脚本封装
- 谷歌浏览器崩溃设置崩溃_Google的广告业务开始崩溃了吗?
- 压缩工具Bandizip
- 图解HTTP学习_day11
- NASA从太空发射激光,制作地球森林高度地图
- kwm转mp3,kwm转flac
- Android安卓成品项目 购物商城系统源码apk
热门文章
- vue-环境变量和模式
- Github|基于 Jittor 的 GAN 模型库
- Nginx快速搭建和基本使用
- c语言 二进制输出_收藏!C语言入门基础知识大全
- redis设置为null问题
- Python无法导入Cython的.pyx文件
- BOM--window对象
- ASP.NET MVC必知必会知识点总结(二)
- java做报表_一步一步使用POI做java报表
- java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...