事务的7种传播行为及事务运行时异常与非运行时异常

事务7种传播行为

Spring 中可以用(propagation:n.传播,宣传,培养)关键字来指定事务的传播行为,spring定义了七种事务传播行为,分别是:

REQUIRED:(常用于增加、删除、修改操作)

如果当前存在事务,则加入该事务,否则新建一个事务。这是最常见的传播行为,也是默认的传播行为。

SUPPORTS:(常用于查询操作)

支持当前事务,如果当前不存在事务,则以非事务方式执行。

MANDATORY:

强制要求当前存在事务,如果不存在事务,则抛出异常。(mandatory:adj.强制的)

REQUIRES_NEW:

重新开启一个新的事务,如果当前存在事务,则挂起该事务。(注意:默认的事务隔离级别——可重复读中 ,开启的新事务读不到之前挂起事务的操作,而且如果操作相同的表会导致锁表,一定要谨慎使用!)

NOT_SUPPORTED:

以非事务方式执行操作,如果当前存在事务,则挂起该事务。

NEVER:

以非事务方式执行操作,如果当前存在事务,则抛出异常。

NESTED:

如果当前存在事务,则嵌套事务中执行。嵌套事务是相对于外部事务而言的,它可以独立提交或回滚,但是嵌套事务的提交或回滚并不会对外部事务产生影响。如果外部事务不存在,那么 NESTED 与 REQUIRED 的效果是一样的。该传播行为只有在使用 JDBC 事务时才有效。

事务传播行为决定了一个方法执行时如何参与到已有的事务中,或者如何创建新的事务。需要根据实际的业务场景和要求来选择合适的事务传播行为。

事务运行时异常与非运行时异常

如果在声明式事务管理中,发生的异常是运行时异常,那么事务自动回滚,如果是非运行时异常,那么事务不回滚,需要手动设置:

rollback-for:

用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。 没有默认值,任何异常都回滚。

no-rollback-for:

用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回 滚。没有默认值,任何异常都回滚。

例如当发生一个非运行时异常FileNotFoundException,我们需要在配置中设置属性rollback-for才能够将发生此异常的操作回滚

 <!--配置事务的属性 -->
        <tx:attributes>
            <!-- 指定方法名称:是业务核心方法
            read-only:是否是只读事务。默认 false,不只读。
            isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
            propagation:指定事务的传播行为。
            timeout:指定超时时间。默认值为: -1。永不超时。
            rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。
            没有默认值,任何异常都回滚。
            no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回
            滚。没有默认值,任何异常都回滚。
            -->
            <tx:method name="addUser"  propagation="REQUIRED"/>
            <tx:method name="changeSal"  propagation="SUPPORTS" rollback-for="FileNotFoundException"/>
        </tx:attributes>

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值