问题解决32:加上了@Transaction注解什么时候才会回滚?

@Tranaction

Spring中有声明式事务和编程式事务,

加上了@Tranaction表示,把当前的事务管理交给Spring来管理,叫做声明式事务

而程序员自己手动进行事务回滚(如AOP拦截异常进行事务回滚)
如下,是手动事务也就是编程式事务


//手动进行回滚
 TransactionAspectSupport.currentTransactionStatus()
 .setRollbackOnly();

我们有时候在代码上看到

@Transactional(rollbackFor = Exception.class) 为什么后面要加 rollbackFor?
答:
因为
在这里插入图片描述
@Transaction 时默认为RuntimeException(也就是运行时异常)异常才会回滚。

源码上有明确的描述。

所以我们有时候出现其他检查性异常的时候就不会进行回滚。

这个时候有两种解决方案:
可以使用编程式事务,也就是手动事务,通过aop拦截,进行事务的回滚


//手动进行回滚
 TransactionAspectSupport.currentTransactionStatus()
 .setRollbackOnly();

2、在@Transaction加上rollbackFor=Exception.class,也就是所有的异常都会进行回滚。

事务注解@Transaction的属性有以下几个: 1. propagation:事务传播行为,默认值为REQUIRED。它定义了当一个方法被另外一个事务性方法调用时,当前的事务是挂起还是继续执行。 2. isolation:事务隔离级别,默认值为DEFAULT。它定义了在并发环境下事务之间的隔离程度,如READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ和SERIALIZABLE等。 3. timeout:事务超时时间,默认值为-1,表示不超时。 4. readOnly:标识事务是否为只读事务,默认值为false。如果设置为true,事务将只读取数据而不修改数据,可以优化事务性能。 5. rollbackFor:发生哪些异常时进行事务回滚,默认值为{},表示任何异常都回滚。可以通过指定异常的Class数组来定义特定的异常,例如{Exception.class}。 6. noRollbackFor:发生哪些异常时不进行事务回滚,默认值为{},表示任何异常都回滚。可以通过指定异常的Class数组来定义特定的异常,例如{RuntimeException.class}。 默认的异常回滚属性是RuntimeException及其子类异常,包括DataAccessException,默认情况下,即使发生RuntimeException及其子类异常,事务也进行回滚。但是,对于其他类型的异常(如Checked Exception),默认情况下事务是不回滚的,除非在rollbackFor属性中指定了这些异常。 总结起来,事务注解@Transaction的属性包括传播行为、隔离级别、超时时间、只读、回滚异常和不回滚异常等。默认的异常回滚为RuntimeException及其子类异常,其他异常需要在rollbackFor属性中指定才进行回滚
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值