声明式事务:即通过 @Transactional 注解来开启事务
要点:
1. 在spring boot中,默认情况下,数据库的事务的作用范围是在JpaRepository的CRUD方法上。
2. 当添加了事务的方法在失败并抛出 RuntimeException 及其子类的时候,会进行回滚。如果想要对所有异常都进行回滚,可以设置:
//设定遇到所有异常都会进行回滚
@Transactional(rollbackFor = Exception.class)
3. @Transactional 只能被应用到 public 方法上, 对于其它非public的方法,如果标记了 @Transactional 也不会报错,但方法没有事务功能。
4. @Transactional 的事务开启 ,或者是基于接口的,或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个有事务的方法,事务是不会起作用的。
readOnly
设置是否为只读事务
@Transactional(readOnly = true)
false(默认值) | 表示为读写事务 |
true | 表示为只读事务,对于jdbc来说,只读事务会有一定的速度优化。此时,事务的隔离级别为 DEFAULT ,传播行为为 REQUIRED |
1 readonly并不是所有数据库都支持的,不同的数据库下会有不同的结果。
2 设置了readonly后,connection都会被赋予readonly,效果取决于数据库的实现。
3 在ORM中,设置了readonly会赋予一些额外的优化,例如在Hibernate中,会被禁止flush等。
作者:maxwellyue
链接:https://www.jianshu.com/p/42cadc8fa1b0
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
事务的传递
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
我们可以看 org.springframework.transaction.annotation.Propagation
枚举类中定义了6个表示传播行为的枚举值:
public enum Propagation {
REQUIRED(0), // 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS(1), // 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
MANDATORY(2), // 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW(3), // 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
NOT_SUPPORTED(4), // 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER(5), // 以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED(6); // 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。
}
//指定方法:通过使用 propagation 属性设置,例如:
@Transactional(propagation = Propagation.REQUIRED)