Spring5框架学习(四)提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 一、事务操作
- 传播行为
- 隔离行为
- transactionManager属性
- propagation 属性
- isolation属性
- timeout readOnly
- 同一个类中函数相互调用
一、事务操作
事务操作的原理
Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事务之前,我们要怎么做。
TransactionDefinition类方法
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
@Nullable
String getName();
}
事务属性包含了5个方面:传播行为、隔离规则、回滚规则、事务超时、是否只读。
传播行为当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。Spring定义了七种传播行为
隔离级别定义了一个事务可能受其他并发事务影响的程度。
1.脏读(Dirty reads)—— 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
2.不可重复读(Nonrepeatable read)—— 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3.幻读(Phantom read)—— 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表transactionManager属性
当存在多个数据源时,往往需要不同的数据源,使用不同的事物管理器,可以使用value属性,或者transactionManager属性指定具体的事物管理器。
propagation 属性propagation用于指定事务的传播行为,默认值为 REQUIRED。
isolation属性isolation用于指定事务的隔离规则,默认值为DEFAULT。
timeout readOnlytimeout用于设置事务的超时属性。
readOnly用于设置事务是否只读属性。
@Transactional 注解尽量直接加在方法上,且必须添加在public方法上,private、protected方法上是无效的
同一个类中函数相互调用同一个类AClass中,有两个函数aFunction、aInnerFunction。aFunction调用aInnerFunction。而且aFunction函数会被外部调用。
情况一:两个函数都添加了@Transactional注解。aInnerFunction抛异常。
情况二:两个函数都添加了@Transactional注解。
情况三:aFunction不添加注解,aInnerFunction添加注解。aInnerFunction抛异常。
public class Class1 {
@Transactional(rollbackFor = Exception.class)
public void aFunction() {
//todo: 数据库操作A(增,删,该)
aInnerFunction(); // 调用内部没有添加@Transactional注解的函数
}
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
private void aInnerFunction() {
//todo: 操作数据B(做了增,删,改 操作)
throw new RuntimeException("函数执行有异常!");
}
}
结果:两个函数对数据库的操作都不会回滚。



