我使用hibernate 2.6与hibernate-entitymanager。我试图捕捉并处理2个事务在对象上发生冲突时的情况。这里是发生了什么:如何检测与Hibernate的事务冲突?
两个线程正在更新一个单一的对象,至少有@Version字段。在刷新时丢失提交竞赛的线程记录StaleObjectStateException。该异常不会被抛出,它只是被记录下来。我猜这个交易标记为回滚 - 仅在那一刻。
之后,当线程尝试执行提交时,它会失败并显示RollbackException。我没有找到一种方法在代码中找出事务回滚的原因。
有没有办法在代码中捕获和处理这种情况?基本上我想捕获StaleObjectStateException,但问题是 - 它不会抛出。
更新:我试图从鸟瞰完成的事情是:
我的JBoss下运行的J2EE应用程序。它有一些内部的定时器调用服务和从UI调用的服务。它也有一个关键实体。我需要确保不同的线程不能同时更新该实体类的对象,因为它可能导致数据不一致。这就是我实施乐观锁定的原因。
当发生乐观锁问题时,我试图通常处理这种情况。我想在非常高的层次上捕获它并显示有效的用户消息(在我的情况下,最高级别是RestEasy的ExceptionMapper)。问题是 - 当我收到RollbackException时 - 已经太晚了。
我不会手动冲洗。我的大多数EJB使用CMT,会话自动刷新。
我已根据您的说明更新了我的答案 – ChssPly76 2009-09-22 21:19:16