Spring事务什么情况下回滚?

本文详细解析了Spring事务管理中的回滚机制,包括事务自动回滚的四个关键条件:方法注解、异常触发、指定异常类型及异常抛出。同时,介绍了如何配置一般异常回滚,以及在无异常情况下的手动回滚方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!

 

 

我们需要注意的地方有四点: 如果你在开发当中引入Spring进行事务管理,但是事务没能正常的自动回滚,可以对照下面四点,缺一不可!

 ①被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解; 拦截配置式:<tx:method />应该包含对该方法,名称格式的定义;且方法需要在expression定义的范围内;

②异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此做出处理;

③指定异常——  默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置);

 举例:实现一般异常的回滚:

注解式:

@Transactional(rollbackFor=Exception.class)  
@RequestMapping("consump")  
public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{   

拦截配置式:

@RequestMapping("consump")  
public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{ 
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception" />  

④异常抛出—— 即方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚;

 

在实际开发中,有时并没有异常发生,但是由于事务结果未满足具体业务需求,所以我们不得不手动回滚事务!

有如下两种方法:

  ①手动抛出异常(如果你没有配置一般异常事务回滚,请抛出运行时异常)  

  ②编程式实现手动回滚  

if(userSave){          
    try {          
        xxx.save();       
    } catch (Exception e) {    
        //尽管可以采用编程式方法回滚事务,但“回滚”只是事务的生命周期之一,所以要么编程实现事务的全部必要周期,要么仍要配置事务切点,即,将事务管理的其他周期交由Spring的标识!       
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
    }         
 }  

 


原文:https://blog.youkuaiyun.com/qq_32331073/article/details/76508147 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值