首页 > 其他分享 >【踩坑记录】@Transactional注解回滚不生效问题

【踩坑记录】@Transactional注解回滚不生效问题

时间:2023-02-07 14:12:29浏览次数:56  
标签:回滚 批处理 Transactional PostConstruct 问题 生效 注解

@Transactional属于是Spring的常用事务处理注解了,最近在开发时偶然发现这个东西竟然不是100%生效的。

问题重现:

测试一个批处理方法,方法上加了@Transactional后执行,因为加了事务处理注解,没怎么关注SQL执行顺序(反正对事务来说都是原子性的),debug过程发现MongoDB连接有问题,有关Mongo的操作抛出了异常,因为数据库的某个字段是批处理的触发条件,并且在批处理过程中会更新这个字段。重新执行发现数据库(Postgresql)的数据被update了,没有触发。嗯,确实之前没关注这个注解会有不生效的问题,开始处理:

首先为了方便测试批处理任务(定时调度的),我在debug阶段直接用了@PostConstruct注解,即项目启动后直接运行批处理任务,像下面这个样子:

@Transaction
@PostConstruct
public void execute() {
    // balabala.....  
}

后来验证问题就出在这个@PostConstruct上。

问题处理:

遇到问题最直接的办法,Google一下,确实涨知识了,以下情况@Transaction注解不会生效:

  1. 被注解标记的方法不是public的
  2. 只有同类中方法调用
  3. 数据库本身不支持事务
  4. propagation或rollbackFor设置错误,这种情况一般都会注意

问题分析:

我们使用的@PostConstruct就是第二种情况不生效导致的,@PostConstruct是Java EE提供的注解,不属于Spring,而@Transactional注解的生效实际是由Spring AOP控制的,生成一个代理类,执行事务开启和提交的逻辑,不过,只有当该类以外使用被@Transactional修饰的方法时,这个代理类才会生成。所以,如果不是debug使用了@PostConstruct,本来其实是没问题的。

 

 

 

标签:回滚,批处理,Transactional,PostConstruct,问题,生效,注解
From: https://www.cnblogs.com/maerpao/p/17098175.html

相关文章

  • java中注解的使用
    1、注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可......
  • 使用注解实现AOP
            ......
  • Spring IOC官方文档学习笔记(九)之基于注解的容器配置
    1.基于注解的配置与基于xml的配置(1)在xml配置文件中,使用context:annotation-config</context:annotation-config>标签即可开启基于注解的配置,如下所示,该标签会隐式的向......
  • Java基础-注解
    常见注解分类Java自带的标准注解@Override:重写@Deprecated:过时@SuppressWarrnings:忽略警告元注解@Retention:用于标明注解被保留的阶段SOURCE:源文件保留CLASS......
  • spring 重复注解和aop拦截的实现示例
    前言:1:jdk1.8开始支持重复注解@Repeatable实现2:aop拦截需要拦截当前注解和@Repeatable指向的包装注解才可以完全拦截到,因为:1.当在在方法上只有一个注解时,aop拦截......
  • 详解Spring AOP自定义可重复注解没有生效问题
    目录1.问题背景2.不啰嗦,上代码3.问题排查3.1是不是切点写得有问题,于是换成如下形式:3.2是不是使用的地方不是代理对象4.问题原因 1.问题背景工作中遇......
  • Spring15 - 全注解开发
    Spring全注解开发全注解开发就是不再使用spring配置文件了,写一个配置类来代替配置文件。packagecom.atguigu.spring6.config;importorg.springframework.context.ann......
  • Spring14 - @Resource注解实现注入
    @Resource注入@Resource注解也可以完成属性注入。那它和@Autowired注解有什么区别?@Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具......
  • Spring12 - 注解管理bean
    Annotation从Java5开始,Java增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变......
  • 【android】Android开发中Gson对象@SerializedName 注解的使用
    当我们使用Gson解析json数据时都会创建一个对应实体类,有时候json数据里面的字段是java关键词或者json数据里面的字段太简单,我们想在实体类中自定义字段名,这时就可以用@Ser......