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