事务的特征,隔离级别等相关内容讲解
树图思维导图提供 Spring声明式事务思维脑图 在线思维导图免费制作,点击“编辑”按钮,可对 Spring声明式事务思维脑图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:0cc909dc1b31bee542f567bb4dc426b5
Spring-04-声明式事务思维导图模板大纲
事务在编程世界一般是对数据库的操作中会涉及的一个概念
事务是数据库操作的最小工作单元 是作为单个逻辑工作单元执行的一系列操作; 这些操作作为一个整体一起向系统提交,要么不执行
XML方式的事务
优点: 1:对代码没有任何侵入性, 2:修改事务相关逻辑时,只需要修改配置文件,无需重新编译代码 3:另外XML方式可以通过切入点表达式灵活的对大量的类添加事务管理
缺点:配置相对于注解更麻烦一些
注解方式的事务
优点:配置简单,使用方便
缺点:无法统一对大量的方法添加事务管理,需要在添加事务的类或方法上一个一个添加事务注解,当工程中需要事务管理的代码很多时,工作量比XML还要大
原子性(atomicity)
原子性是指 事务包含的所有操作要么全部成功,要么全部失败 因此事务的操作如果成功就必须要完全应用到数据库, 如果操作失败指责不能对数据库造成任何影响
一致性(consistency)
一致性:指事务必须使数据库从一个 一致性状态 变化到另一个一致性状态, 也就是说一个事务执行之前和执行之后,都必须处于一致性状态 (事务执行之前的数据状态和事务执行之后的状态要保持一致)
隔离性(isolcation)
隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他的事务所干扰,多个并发事务之间要相互隔离。
持久性(durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。 即使是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
事务的隔离级别描述的是:多个事物之间的可见性问题
幻读(虚读)
插入时,记录不存在,但却插入失败(记录存在) 删除时,记录不存在,但却删除成功(记录存在)
所谓的幻读,就是前后两次读取到的记录行数不一致。 事务A在读取某些记录时,事务B又在事务A内插入了一条新记录,当事务A再次读取该范围的记 录时,发现前后两次读取的结果集不是完全一致。
不可重复读取
在一个事务处理过程中读取了另一个事务中修改并已提交的数据, 导致两次查询结果不一致 一个事务读另一个事务修改后的数据
脏读
脏读就是指在一个事务处理过程中读取了另一个未提交的事务中的数据 , 导致两 次查询结果不一致 一个事务读另一个事务未提交的数据
读未提交(read uncommitted )
当 前事务可以读取其他事务未提交的数据,也称之为脏读
会出现 不可重复读 和 幻读 和 脏读 的情况
读已提交(read committed )
只能读取到其他事务已经提交的数据,可以避免脏读。读已提 交不能保证可重复读
会出现 不可重复读 和 幻读的情况
可重复读 (repeatable read)
可重复读。在同一个事务内的查询都是事务开始时刻一致的, InnoDB默认级别。会出现幻读的情况
会出现 不可重复读 和 幻读的情况
串行读(Serializable)
是最高的隔离级别,通过强制的事务串行执行,避免了前面说的幻读问 题。简单的来说,Serializable会在读取的每张表上加锁,所以可能导致大量的超时和锁竞争的 问题。实际应用中很少用到这一级别
无
一次只能执行一个事务
Mysql默认隔离级别:Repeatable-read
Oracle默认隔离级别:Read committed
事务的传播行为
事务传播:描述事务与事务之间的传播关系,
常见场景: 在一个嵌套调用的方法中,外部内部每个方法都添加了事务管理,不同的传播行为配置,决定了最终时这些方法是使用同一个事物,还是在不同的事务中运行
propagation_required (默认)
支持当前事务, 如果当前已经存在十五,就加入到事务中执行, 如果当前没有食物就新建一个事务 这是最常见的选择
嵌套事务:与REQUIRED不同,NESTED支持真正意义上的子十五, 父事务回滚会将所有的子事务都回滚, 子事务的回滚,不会引起父事务的回滚。 而REQUIRED其实只有一个物理事务
Isolation_Default(默认级别)
这是一个PlatfromTransactionManger默认的隔离级别 使用数据库默认的事务隔离级别
ISOLATION_SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级 别。 事务被处理为顺序执行。 除了防止脏读, 不可重复读外,还避免了幻像读(一个事务在 提交前不允许别的事务读取、更新、插入)。
Spring如何设置隔离级别
XML
<!--isolation:设置隔离级别--> <tx:method name="tran*" timeout="500" propagation="REQUIRED" isolation="READ_COMMITTED"/>
注解
@Transactional( isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, timeout = 5000, readOnly = true, rollbackFor = Exception.class, noRollbackFor = NullPointerException.class)
编程式事务
把事务控制的代码直接显式写死到业务代码中
优点是简单,缺点繁 琐、重复代码太多、不方便维护
声明式事务
在业务代码中基本看不到任何事务管理相关的逻辑, 而是通过AOP在运行期动态将事务逻辑 织入到 需要事务管理的地方, 优点:可以在一个统一的地方管理事务,代码中无需写重复的事务代码,业务代码更清晰明了,便于维护 缺点:需要额外配置
声明式事务底层是用aop实现的。
Spring中的声明式事务
Spring中的事务底层是使用Spring AOP来进行实现的。
在Xml中使用事务的步骤
在注解中使用声明式事务的步骤