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