Spring boot 2.0 声明式事务

声明式事务:即通过 @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

 Spring 事务 readOnly 到底是怎么回事?

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)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值