我的服务中有一个方法,@Transactional
注释。
在里面,我正在用2个对象做各种事情,最后,我想对其中一个进行.discard()
更改,因此它不会保存在此事务中。
我所做的是将有关object2的信息发送到我的ActiveMQ队列,由侦听器接收它,在那里完成了一些工作,最后它保存在另一个事务中。
Object1应该像往常一样保存。
然而,这不起作用。发生的事情是,我的队列中的侦听器能够.get()
该对象,在第一个事务结束之前对其进行一些更改并.save()
。多亏了这一点,我得到org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
。
我在服务中执行.get()
个对象。退出服务并返回控制器时会保存事务。
如何防止Grails在主事务中保存object2?
答案 0 :(得分:0)
您可以在服务方法结束之前在object2上尝试.refresh()
。这将使用数据库中的更新数据重新加载和覆盖object2中的任何数据,因此乐观锁定version
变量匹配(我认为这是导致Exception
的原因)。并且Hibernate不需要刷新对象,因为它现在与数据库匹配。