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

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。【踩坑记录】@Transactional注解回滚不生效问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

@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,本来其实是没问题的。

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/206160.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!