2

我对 Hibernate 真的很生气!

我有一个数据库表(mysql),其中包含允许我构建类别树的父子关系。我有多个线程可以尝试获取,如果没有,则大致同时创建类别路径(隐含多个父子行)。

问题是我只使用 TRANSACTION_READ_COMMITTED,因此可能会出现竞争条件,其中线程可以为类别子路径创建父子路径,因为它没有找到它,然后(瞧!)另一个线程在同时。为了尝试解决这个问题,我对父/子 id 设置了唯一约束,并在完整类别路径上设置了唯一约束。然后,我希望在我的会话中,我会捕获休眠的 ConstraintViolationException,并且知道另一个线程为我写了新的关系,我查询另一个线程在 catch 子句中写的行。并尝试在该线程中继续执行会话所需的所有操作。

这是我能想到的解决多个线程同时进行获取/创建相同的长类别路径(具有多个子父子关系行)的问题的唯一方法,并确保唯一约束是坚持。

但是休眠使 ConstraintViolationException 上的会话无效并最终引发断言异常(“com.stagirite.bean.Category 条目中的空 id(发生异常后不要刷新会话)”)所以我的解决方案是不可行的。

对于不创建重复行的“获取/创建”模型,我将如何在整个应用程序中解决这个问题,而不使用悲观锁?

安迪

4

1 回答 1

0

由于我不确定您如何对数据(自引用表或材料化路径)和相应的休眠映射进行建模,因此我将尝试回答两个线程试图更改相同内容的部分。您是否尝试过使用休眠版本控制功能。简而言之,如果一个线程已经更新了一个类别,则版本号会增加。可能已经开始更新但未完成更新的另一个线程将看到版本更改和回滚。如果您可以发布您的数据模型,这将有所帮助。

希望有帮助。

于 2011-04-09T15:17:14.503 回答