gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:24 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com