java - Spring @Transaction (readonly=true) 上下文在进程中间将数据提交到DB

标签 java spring hibernate transactions

我正在做一项任务,以使代码具有事务性。我有一段时间遇到有关只读事务的问题,并且我在互联网上找到的任何建议都不起作用。 (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());
    }

中间没有运行任何更新或插入查询,只有选择。但是此代码片段执行结束时,它将数据提交到数据库(无论设置给 setter 方法的值是什么,都将保留到数据库中)

有人可以告诉我这里发生了什么问题吗?您的反馈将非常有用。

最佳答案

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

当flushMode为AUTO时, hibernate 会将脏对象刷新到数据库。 Read this for understand hibernate data flushin

作为解决方案,我在事务方法中手动将刷新模式更改为“COMMIT”。

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

关于java - Spring @Transaction (readonly=true) 上下文在进程中间将数据提交到DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43735991/

相关文章:

java - 最适合存储日期和时间的 SQL 和 Java 数据类型

java - 在另一个实例化对象的最佳方法 - java

java - JAX-WS 线程安全

java - Web 服务与 opencms 集成

java - 用户可以打开 jar 内的文本文件并对其进行更改吗?

xml - 如何通过 XML 在 Spring bean 中设置 XmlAdapters 的 Jaxb2Marshaller 列表?

java - Spring JMX - 将包中的类注册为 MBean

java - hibernate 条件子查询

java - Hibernate 标准投影

hibernate - Grails:在复合键上映射域类字段