java吧 关注:1,271,970贴子:12,780,415
  • 4回复贴,共1

关于事务的问题

只看楼主收藏回复

a方法有@transaction注解,调用了b方法(没有@transaction注解),b方法调用c方法(有@transaction注解),如果c方法错了,b方法会回滚吗,a方法会回滚吗


IP属地:陕西来自Android客户端1楼2023-04-23 14:11回复
    了解下spring的事务的传播特性,而且你这样写到时候出了问题排查不难受吗,事务嵌套


    IP属地:陕西来自Android客户端3楼2023-04-23 15:25
    收起回复
      2025-07-31 22:17:35
      广告
      不感兴趣
      开通SVIP免广告
      当使用 Spring 框架的事务管理时,如果在一个方法上使用了 @transaction 注解,那么该方法将在一个事务的上下文中执行。在您提供的情况中,我们有如下的方法调用链:a -> b -> c。
      a 方法有 @transaction 注解。
      b 方法没有 @transaction 注解。
      c 方法有 @transaction 注解。
      根据您的描述,假设 c 方法出现了错误。这里是每个方法的事务回滚情况:
      c 方法:由于它有 @transaction 注解,因此它将回滚自己的事务。也就是说,只要 c 方法中有错误,它执行的数据库操作都会回滚。
      b 方法:尽管 b 方法没有 @transaction 注解,但它调用了一个有事务的 c 方法。如果 c 方法出错,c 方法的事务将回滚,但这不会直接导致 b 方法回滚。然而,由于 b 方法在 a 方法的事务范围内执行,如果 a 方法的事务被触发回滚,那么 b 方法的操作也会回滚。
      a 方法:a 方法有 @transaction 注解,因此它执行在一个事务的上下文中。当 a 方法调用 b 方法时,b 方法会加入到 a 方法的事务中。由于 b 方法调用了 c 方法,如果 c 方法出现错误并回滚,那么通常情况下,这个错误会被传播到 a 方法。这将导致 a 方法的事务也回滚,包括 a 方法和 b 方法的所有操作。
      综上所述,如果 c 方法出错,a 方法和 b 方法都将回滚。但请注意,这种情况可能受到事务传播行为、隔离级别和其他事务相关配置的影响。确保在实际应用中仔细测试和验证事务管理行为。


      IP属地:陕西来自Android客户端4楼2023-04-23 15:27
      回复
        spring默认就是没事物开事物,有事物就用当前事物,你要是同一个连接跑的话是会回滚


        IP属地:北京来自Android客户端5楼2023-04-23 15:28
        回复