首页 > 其他分享 >@Transactional(rollbackFor = Exception.class) 事务失效 A加了@Transactional注解,A调用了同方法中的B方法,B未加注解。B事务失效,怎么

@Transactional(rollbackFor = Exception.class) 事务失效 A加了@Transactional注解,A调用了同方法中的B方法,B未加注解。B事务失效,怎么

时间:2024-05-30 10:15:28浏览次数:15  
标签:事务 调用 Spring Transactional 失效 注解 方法

@Transactional(rollbackFor = Exception.class) 事务失效,一个方法A上加了这个注解,在方法A中调用了B方法,A方法中有数据库操作,B方法中也有,现在问题是,B方法中事务失效了,怎么保证不失效

 

在Spring框架中,使用@Transactional注解可以很方便地管理事务,但是如果你在方法A中调用了方法B,并且两者都在同一个类中,那么通过普通方法调用(非AOP代理)方式,事务传播行为可能不会如你所愿地工作。

这是因为在Spring AOP中,事务是通过代理模式实现的。当你从外部(比如通过Spring容器注入的bean)调用方法A时,Spring会创建一个代理来拦截这个调用,并应用@Transactional注解定义的事务行为。但是,如果方法A内部直接调用了同一个类的其他方法(比如方法B),那么这个调用不会经过Spring的代理,因此事务属性不会被应用。

为了解决这个问题,你可以采取以下几种方法之一:

将方法B移到另一个类中:

    1. 这是最常见且推荐的做法。将方法B移动到另一个Spring管理的bean中,然后从方法A中通过注入的方式调用这个bean的方法B。这样,每次调用都会通过Spring的代理,从而确保事务行为被正确应用。

 

对于 @Transactional(rollbackFor = Exception.class) 事务失效,一个方法A上加了这个注解,在方法A中调用了B方法,A方法中有数据库操作,B方法中也有数据库操作,对于方法B需要也加上这注解吗?

在Spring中,如果方法A上使用了@Transactional注解,并且你在方法A中调用了同一个类中的方法B,那么方法B上的事务属性(如果有的话)将不会被考虑,因为方法B的调用不是通过Spring的AOP代理进行的。

因此,如果方法B也包含数据库操作,并且这些操作需要在事务的上下文中执行,那么不需要在方法B上额外添加@Transactional注解。相反,你应该确保方法A的事务设置(包括rollbackFor = Exception.class)能够覆盖到方法B中的数据库操作。

如果方法B中的操作需要独立于方法A的事务执行(即,它们应该运行在不同的事务中),那么你应该考虑将方法B移动到另一个bean中,并在方法B上添加适当的@Transactional注解。

总结:

  • 如果方法B中的操作应该包含在方法A的事务中,那么不需要在方法B上添加@Transactional
  • 如果方法B中的操作需要运行在不同的事务中,那么将方法B移动到另一个bean中,并在方法B上添加@Transactional

请注意,即使方法B在同一个类中并且没有@Transactional注解,只要它是由带有@Transactional注解的方法A调用的,并且是通过Spring的AOP代理进行的(即,不是通过this关键字直接调用),那么方法B中的操作仍然会包含在方法A的事务中。但是,为了避免混淆和潜在的错误,最好将相关的业务逻辑组织到合适的类中,并仅在需要的地方使用@Transactional注解。

标签:事务,调用,Spring,Transactional,失效,注解,方法
From: https://www.cnblogs.com/isme-zjh/p/18221797

相关文章

  • Chrome翻译网页功能失效(2024)
    使用chrome网页翻译失效浅记一下1.修改 C:\Windows\System32\drivers\etc文件夹下的hosts文件(保存提示没有管理员权限,可在文件右键属性中修改用户权限)2. 将下面的内容填写进去,我以216.239.32.40做了示范,可以根据实际IP更改(ip获取可以pinggoogle.cn获取到的ip地址也可以)......
  • ColoredBox child 是 Scaffold 颜色失效
    在Flutter中,Scaffold小部件有自己的一组属性来管理其外观,包括背景颜色。当你将Scaffold作为ColoredBox的子小部件时,Scaffold的backgroundColor属性将覆盖ColoredBox的颜色。要解决这个问题,你可以直接设置Scaffold的backgroundColor属性,而不是使用ColoredBox。如......
  • 解决因跨域导致使用a标签下载文件download属性失效无法自定义命名的问题
    问题背景:在使用a标签下载文件时,download属性可以更改下载的文件//下载a.exe,并采用默认命名<ahref="/images/a.exe"download>点击下载</a>//将a.exe改名为b.exe下载<ahref="/images/a.exe"download="b">点击下载</a>注意:html5新特性a标签download属性只支持......
  • @PostConstruct 注解方法 mybatis-plus分页插件 PageHelper失效
    需求:启动项目把某些高频搜索的数据,放入到缓存中;现象:利用@PostConstruct项目启动加载,但是并没有做到分页,而是降所有数据放入的redis中,出现问题 @PostConstruct注解方法mybatis-plus分页插件PageHelper失效@PostConstructpublicvoidinit(){longkeyStartTime......
  • 浅析SpringBoot中的AOP以及自定义注解类
    概念说明SpringBoot中的AOP(面向切面编程)是一种编程范式,它允许开发者定义跨多个对象的横切关注点。横切关注点是与业务逻辑无关的功能,如日志记录、安全检查、事务管理等。AOP的主要目的是将横切关注点与业务逻辑分离,提高代码的模块化和可维护性。AOP的核心概念包括:切面(As......
  • @Transactional(rollbackFor = Exception.class)注解的方法A,此方法A中插入成功,再调用
    当你在一个带有@Transactional注解的方法中插入数据成功,然后调用另一个方法(无论该方法是否也带有@Transactional注解),但发现第二个方法中的插入语句没有实际插入数据,但打印出了insert语句,这通常意味着事务没有按预期执行或事务被提前提交了。这里有几个可能的原因和解决方案:自......
  • vue首屏加载动画打包后失效
    本地环境运行时,没有问题,打包后,加载动画没有效果,尝试修改:extract:false后成功。 加载动画示例:index.html中<linkrel="stylesheet"href="static/css/loading.css"/><body><divid="app"><divid="appLoading"><d......
  • 警惕!自定义注解使用不当的排查实录
    一、引言大家好,在日常开发过程中,Java注解(Annotation)是开发中经常使用的一个手段,用于给代码添加元数据的标记。它们可以提供代码额外的信息,这些信息可以在编译时或运行时被访问。注解不会改变代码的执行逻辑,但可以被编译器、JVM或框架等工具用于生成额外的代码、提供警告或执......
  • 【C++/STL】vector(常见接口、模拟实现、迭代器失效)
     ......
  • @Qualifier注解的作用
    @Qualifier注解在Spring框架中的作用主要是用来解决自动装配时可能出现的歧义性,也就是当有多个类型兼容的Bean可以注入到同一位置时,通过指定@Qualifier来明确注入哪一个Bean。在使用自动装配(如@Autowired)时,如果Spring容器中存在多个同类型的Bean,Spring将无法决定使用哪一个......