zoukankan      html  css  js  c++  java
  • spring jpa事务注解@Transactional使用注意事项

      在改之前部门定时任务需求时遇见debug查看已经执行了某一段sql,log日志也已经打印sql执行,但是去查看数据库发现数据库里的数据并未改变。

    但是出于服务器多台部署争抢执行定时任务的考虑,这个任务开始时数据库状态必须改变其他机器便不再执行,后参考资料将Dao.save(entity);改为saveAndFlush()后并未管用。

    解决方法:

    是因为执行了save()方法,也执行了sql语句,但是因为使用的是

    @Transactional

    注解,不是手动去提交事务,所以这一条语句已经插入到数据库了,但是当前不可见。

    所以最后可以采用

    this.userRepository.saveAndFlush()

    方法,让它及时的flush到数据库中。

    最终解决方案:

      问题出自@Transactional被之前的开发加在了整个类上,只有等当前事务完成后才会改变数据库,由于当时的业务场景并不会出现问题。现在多台部署要考虑状态。

    将改任务状态的方法独立放到另一个类用PROPAGATION_REQUIRES_NEW来解决。

    @Transactional(value = Transactional.TxType.REQUIRES_NEW, rollbackOn = Exception.class)
    public Boolean updateJobStatus(ScheduleJob scheduleJob,Integer status){}

    传播特性名称说明
    PROPAGATION_REQUIRED 如果当前没有事物,则新建一个事物;如果已经存在一个事物,则加入到这个事物中
    PROPAGATION_SUPPORTS 支持当前事物,如果当前没有事物,则以非事物方式执行
    PROPAGATION_MANDATORY 使用当前事物,如果当前没有事物,则抛出异常
    PROPAGATION_REQUIRES_NEW 新建事物,如果当前已经存在事物,则挂起当前事物
    PROPAGATION_NOT_SUPPORTED 以非事物方式执行,如果当前存在事物,则挂起当前事物
    PROPAGATION_NEVER 以非事物方式执行,如果当前存在事物,则抛出异常
    PROPAGATION_NESTED 如果当前存在事物,则在嵌套事物内执行;如果当前没有事物,则与PROPAGATION_REQUIRED传播特性相同
  • 相关阅读:
    [Java]内部类
    [Java]项目经验之谈
    [IDE]Netbeans
    [HTML5游戏开发]开发者如何真正的面向HTML5平台开发游戏?
    [HTML5游戏开发]两款很棒的 HTML5 游戏开发工具
    [HTML5游戏开发]HTML5游戏让你惊喜吗?
    How To Design A Mobile Game With HTML5
    [WebSimpleDB]HTML5之IndexedDB使用详解
    [HTML5]WAI-ARIA介绍
    [MiniPro]Android GPS-从上到下整个框架剖析与案例解说
  • 原文地址:https://www.cnblogs.com/zzpblogs/p/14148565.html
Copyright © 2011-2022 走看看