@Transactional 注解的事务传播特性

@Transactional 注解在 Spring 框架中用于控制方法级别的事务行为。它允许您指定事务的传播行为(propagation)、隔离级别(isolation)、超时(timeout)、只读(readOnly)和回滚规则(通过rollbackFor和noRollbackFor属性指定异常)。这里主要讨论事务的传播行为,它是通过 propagation 属性指定的,有以下几种常见的传播行为:

REQUIRED (默认)

当前方法如果在已有事务中(即调用者方法开启了事务),则加入该事务执行,不会开启新事务。
如果当前方法不在任何事务中,会自动开启一个新的事务。
通常情况下,这是最常用的事务传播行为,适用于大部分业务场景。

REQUIRES_NEW

当前方法总会开启一个新的事务,并在其内部执行,即使调用者方法已经存在事务。
如果调用者方法有事务,那么在进入当前方法时,会先挂起调用者的事务。
当前方法结束后,新开启的事务会独立提交或回滚,无论调用者事务最终状态如何。
适用于需要确保方法内的操作独立于调用者事务,或者需要在全局事务中嵌套一个完全独立的事务的情况。

SUPPORTS

如果当前方法在已有事务中,就在该事务内执行;否则,以非事务方式执行。
该方法不主动开启事务,只是“支持”(参与到)已有的事务中,但不会因为没有事务而抛出错误。
适用于那些不需要事务也能正常工作的业务逻辑,或者可以参与到事务但不是必须的方法。

NOT_SUPPORTED

如果当前方法在已有事务中,会挂起当前事务,以非事务方式执行。
如果当前方法不在事务中,直接以非事务方式执行。
该方法始终不会参与到任何事务中,适合那些明确不需要事务参与的操作。

MANDATORY

当前方法必须在已有事务中执行,否则抛出异常。
如果调用者方法已经开启了事务,当前方法就在该事务内执行;否则,抛出TransactionRequiredException。
用于确保只有在事务环境中才能执行的方法,防止无事务状态下意外执行。

NEVER

当前方法绝对不能在事务中执行,如果调用者方法有事务,会抛出异常。
如果当前方法不在事务中,正常执行;如果调用者方法开启了事务,抛出IllegalTransactionStateException。
适用于那些与事务不兼容,必须在非事务环境下执行的操作。

NESTED

当前方法如果在已有事务中,会在该事务内开启一个嵌套事务(保存点)。
如果当前方法不在事务中,行为类似于REQUIRED,开启一个新的事务。
嵌套事务内部可以独立提交或回滚,不会影响外部事务;但如果外部事务发生回滚,嵌套事务也会随之回滚。
需要注意的是,不是所有的事务管理器都支持嵌套事务(如JDBC不支持,JPA和JTA支持)。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值