在StaleObjectStateException之后处理Hibernate会话中断的首选方法

时间:2013-07-21 21:44:36

标签: hibernate grails locking gorm

问题出在Grails GORM编程的背景下,但如果确实存在任何真正的差异,那么在其他Hibernate用途中了解这种情况会很有趣。

当尝试保存未通过锁定选择的对象时,如果数据库对象由另一个线程/应用程序同时更新,则可以获得StaleObjectStateException。 Hibernate文档说,在这样的异常之后整个会话都无法使用,因为这个异常可能会以某种方式搞乱会话状态。似乎在此会话中打开的每个对象也变得不可用,即使这样的对象实际上甚至没有被另一个线程修改。似乎即使在逻辑上应该可以工作,也不能在同一个会话中使用.refresh()/ modify / .save()对象。

那么会话破坏的处理是什么,是否有一种首选方式来处理它?重新选择对象本身不是问题,但是在该会话中选择的每个其他对象变得不可用的事实是非常有问题的。我有一个复杂的方法,它加载了很多这些对象并将它们保存在不同的地方的内存中,如何在异常后处理它? 我不想只是回滚方法在其中一个对象获得此异常时所做的一切,逻辑足够智能,只需处理它,如果有办法保持会话/对象可操作。是否真的必须通过内存中的每个对象并以某种方式刷新它只是因为其中一个被另一个线程更新?

StatelessSession是否值得考虑?

也许我在这里错过了什么?有很多关于StaleObjectStateException的问题,几乎没有人甚至将此列为关注点?是不是在同一会话中选择的任何对象都可以随机变得无法使用,只要在后台更新其中一个对象是一个很大的不便之处?

0 个答案:

没有答案