五种隔离级别(其实是四种,但是有一种默认的也要单独记)
首先复习一下事务的四个特性ACID:
ACID特性:原子性(操作不可分割),一致性,隔离性(多个事务并发时不会导致数据不一致),持久性(对数据的修改是永久的)
脏读:一个事务读取到另一事务未提交的更新数据
不可重复读:一个事务期间两次读到同一个数据不一致
幻读:读取的数据的行数有问题
可重复读:当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。因此,如果在同一个事务中发出同一个SELECT语句两次或更多次,那么产生的结果数据集总是相同的。因此,使用可重复读隔离级别的事务可以多次检索同一行集,并对它们执行任意操作,直到提交或回滚操作终止该事务。
如何解决幻读:间隙锁
七种事务传播行为
保证在同一个事务中
PROPAGATION_REQUIRED:支持当前事务,如果不存在 就新建一个(默认)
required需要事务,没有就自己建一个。
PROPAGATION_SUPPORTS: 支持当前事务,如果不存在,就不使用事务
support支持,说明不强制
PROPAGATION_MANDATORY :支持当前事务,如果不存在,抛出异常
mandatory 强制的,你没有我就抛异常了啊!
保证不在同一个事务中
PROPAGATION_REQUIRES_NEW: 如果有事务存在,挂起当前事务,创建一个新的事务
required_new需要新的
PROPAGATION_NOT_SUPPORTED :以非事务方式运行,如果有事务存在,挂起当前事务
不支持事务,但我也只是不支持,你有我就挂起
PROPAGATION_NEVER: 以非事务方式运行,如果有事务存在,抛出异常
不支持就是不支持,没得商量!
嵌套执行事务
PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行
正如其名,可以嵌套~
事务管理的三种接口
PlatformTransactionManager事务管理器
这个接口提供了多种事务管理器,如为JDBC提供的,为Hibernate提供的,为JPA提供的
接口里面定义了三个方法:
获得事务,提交事务,回滚事务。
TransactionDefinition 事务定义信息,比如事务超时时间、隔离级别、传播行为,回滚规则,是否只读。
TransactionStatus 事务运行状态接口,提供了一些方法来获取事务相应的状态比如是否新事务、是否可以回滚等等。
事务管理器接口通过后两个接口来进行事务管理。
编程式事务(比如用xml)
声明式事务(用注解)
后两个没什么好说的,代码网上非常多。