Spring事务-哪些场景或什么情况下spring事务会失效

本文探讨了Spring事务可能失效的常见场景,包括错误的使用或设置,如同类方法内部调用、事务未被Spring管理、非public方法、错误的传播机制(如NOT_SUPPORTED)以及数据库不支持事务(如MyISAM)。另外,事务失效也可能由于错误的异常处理,如没有向外抛出异常或捕获异常后抛出新的异常,导致事务无法正常回滚。
摘要由CSDN通过智能技术生成


前言

spring事务是我们java开发过程中会遇到失效的问题.
在这里记录下,如有遗漏欢迎指出


先记录下我们在开发过程会遇到常见的场景
事务失效会可以分类2类:

  1. 你错误的设置或使用了事务
  2. 发生错误后没有正确的处理

错误的使用或设置方式

同类方法中的调用(最常见的)

@Service
public  class TestService {
    
	public void testTran(){
	    //其他实现
	    insertInfo();
	}
	
	@Transactional
	public void insertInfo(){
	    //具体的实现
	}
}

事务未被Spring管理

//@Service(没有把类纳入spring管理容器)
public class TestService {
   @Transactional
   public void testTran(){
   	//具体的方法
   }
}

方法修饰符不是public的

@Service
public class TestService {

   @Transactional
   private testTran(){
   	//具体的方法
   }
}

错误的传播机制

比如你错误的把事务的传播截止设置为NOT_SUPPORTED

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void insertInfo(){
        //具体的实现
    }

数据库不支持事务

例如我们现在常用的关系型数据库mysql它在InnoDB引擎下是只是事务的,
但是在MyISAM下是不支持事务的.

没有正确的处理回滚

没有向外抛出异常

我们在开发过程中错误的try catch

@Transactional
public void insertInfo(){
     try {
         //具体的实现
     }catch (Exception e){
         log.error("保存出错: {}", e);
     }
 }

捕获异常后抛出新的异常(或自定义异常)

    @Transactional
    public void insertInfo(){
        try {
            //具体的实现
        }catch (Exception e){
            throw new Exception("test");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值