spring事务及失效场景及具体分析

spring事务一般采用注解实现,当然也可以用xml配置。
方法上加上@Transactional

在使用 Spring 事务时不能使用 try-catch 进行异常捕获,要将异常抛给外层,使其进行异常拦截,触发事务机制。
在这里插入图片描述
spring事务在某些场景下会失效:

  1. 抛出检查型异常时事务失效,即写try catch异常失效
    Exception 受检查的异常:在程序中必须使用 try…catch 进行处理,遇到这种异常不处理,编译器会报错。例如 IOException 。

如果想实现只要抛出异常就回滚,可以通过添加注解 @Transactional(rollbackFor=Exception.class)
实现。

  1. 一个事务方法调用另一个事务方法时失效

因为Spring 的声明式事务使用了代理。此时必须指定事务应该如何传播,也就是传播行为
事务传播行为是为了解决业务层方法之间互相调用的事务问题

共有七种
@Transactional(propagation = Propagation.REQUIRED)
@Transactional(propagation = Propagation.REQUIRES_NEW)

补充说明:

  • MySQL 且引擎是 MyISAM,则事务会不起作用,原因是 MyISAM 不支持事务,改成 InnoDB 引擎则支持事务。
  • 注解 @Trasactional 只能加在 public 修饰的方法上事务才起效。如果加在 protect、private 等非
    public 修饰的方法上,事务将失效。
  • 如果在开启了事务的方法内,使用了 try-catch 语句块对异常进行了捕获,而没有将异常抛到外层,事务将不起效。
  • 不同类之间方法调用时,异常发生在无事务的方法A中,但不是被调用的方法B产生的,被调用的方法B的事务无效。只有异常发生在开启事务的方法B内,事务才有效。

Spring 事务是使用 AOP 代理,环绕通知和异常通知,就是对方法进行拦截,在方法执行前开启事务,在捕获到异常时进行事务回滚,在方法执行完成后提交事务。

Spring事务传播机制是指在多个事务方法调用场景下,如何管理这些事务的提交和回滚。Spring提供了多种事务传播行为,包括: 1. REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常用的传播行为。 2. REQUIRES_NEW:每次都创建一个新的事务,如果当前存在事务,则将其挂起。 3. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。 4. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将其挂起。 5. MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 6. NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。 7. NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。嵌套事务是外部事务的一部分,它有自己的保存点和回滚范围。 事务失效场景包括: 1. 异常未被捕获并处理,导致事务没有正常回滚。 2. 在没有开启事务的情况下调用带有@Transactional注解的方法,导致方法执行时没有开启事务。 3. 在同一个类中的方法互相调用,而没有通过代理对象进行调用,导致事务失效。 4. 在事务方法中使用了try-catch块并捕获异常,没有主动抛出异常调用setRollbackOnly方法,导致事务无法回滚。 需要注意的是,事务失效可能与具体的配置和使用方式有关,详细的分析和排查需要根据具体的代码和配置进行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值