问题是在 Grails GORM 编程的上下文中,但是如果确实存在任何真正的差异,那么了解其他 Hibernate 使用中的情况会很有趣。
当尝试保存未选择锁定的对象时,如果数据库对象同时被另一个线程/应用程序更新,则可能会收到 StaleObjectStateException。Hibernate 文档说在这样的异常之后整个会话不可用,因为这个异常可能会以某种方式弄乱会话状态。似乎在此会话中打开的每个对象也变得不可用,即使这样的对象实际上甚至没有被另一个线程修改。似乎甚至不能在同一会话中对对象进行 .refresh()/modify/.save() ,即使从逻辑上讲这应该有效。
那么会话中断的处理是什么,是否有更好的方法来处理它?重新选择对象本身不是问题,但是在该会话中选择的所有其他对象都变得不可用的事实是非常有问题的。我有一个复杂的方法,它加载了很多这些对象并将它们保存在不同位置的内存中,我该如何在异常发生后处理这个问题?我不想在其中一个对象出现此异常时回滚该方法所做的所有事情,如果有办法保持会话/对象可操作,逻辑足够智能以处理它。是否真的必须遍历内存中的每一个对象并以某种方式刷新它,只是因为其中一个被另一个线程更新了?
StatelessSession 需要考虑吗?
另外,也许我在这里遗漏了一些东西?有很多关于 StaleObjectStateException 的问题,几乎没有一个甚至将其列为关注点?如果在后台仅更新其中一个对象,那么在同一会话中选择的任何对象都可能随机变得不可用,这难道不是一个很大的不便吗?