【问题标题】:Spring @Transaction (readonly=true) context commit data to DB in the middle of the processSpring @Transaction (readonly=true) 上下文在进程中间将数据提交到数据库
【发布时间】:2017-05-02 10:46:56
【问题描述】:

我正在执行一项任务,以使代码具有事务性。我在一段时间内遇到了关于只读事务的这个问题,而且我在互联网上找到的任何一个建议都没有奏效。 (Spring和hibernate集成项目)

这是我的只读事务方法

@Transactional(propagation=Propagation.REQUIRES_NEW, readOnly=true 
,rollbackFor=Exception.class)
    public void 
editInternationalExportConsigment(InternationalExportConsignmentFormWrapper 
exportConssi (){}

在这个方法中,发生了一个翻译进程。进程从数据库中获取(选择)数据并设置为对象的位置

  Contact contact =inquiry.loadCustomerContactById(consignmentVO.getCustomerContactId().intValue()); 

    if (contact != null && contact.getCity() != null) {
          consignment.setOrgin(contact.getCity().getCountry());
          consignment.setUniqueOriginCountry((contact.getCity().getCountry()!=null)?contact.getCity().getCountry().getId():null);
          consignment.setOrginCity(contact.getCity());
    }

中间没有任何更新或插入查询运行,只有选择。但是在这段代码 sn-p 执行结束时,它将数据提交到 DB(无论设置为 setter 方法的值将持续到 DB 中)

谁能告诉我这里发生了什么问题。您的反馈将非常有用。

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

    经过繁琐的研究,我找到了答案。在我们的项目中,有两个会话工厂正在运行。它还使用 spring OpenSessionInViewFilter 来避免'延迟初始化' 问题。 OpenSessionInViewFilter 已将 flushMode 设置为 Auto。由于 OpenSessionInViewFilter 在整个过程中一直将休眠会话绑定到线程,因此它将覆盖在我启动新事务时创建的事务性休眠会话对象。因此,即使我保持刷新模式为事务范围为 'COMMIT',它被声明为 OpenSessionInViewFilter 的属性用 AUTO 属性覆盖。

    当 flushMode 为 AUTO 时,休眠会将脏对象刷新到 DB。 Read this for understand hibernate data flushin

    作为一种解决方案,我在我的事务方法中手动将刷新模式更改为 'COMMIT'

    感谢大家的回复和评论。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2014-05-29
      • 2020-05-16
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多