【发布时间】:2011-07-09 11:06:11
【问题描述】:
我对 Hibernate 真的很不满意!
我有一个数据库表 (mysql),其中包含允许我构建类别树的父子关系。我有多个线程可以尝试获取,如果没有,则大致同时创建类别路径(隐含多个父子行)。
问题是我只使用 TRANSACTION_READ_COMMITTED,因此可能会出现竞争条件,其中线程可以为类别子路径创建父子路径,因为它没有找到它,然后(瞧!)另一个线程做了同时这。为了尝试解决这个问题,我对父/子 id 设置了唯一约束,并在完整类别路径上设置了唯一约束。然后,我希望在我的会话中,我会捕获休眠的 ConstraintViolationException,并且知道另一个线程为我写了新的关系,我查询另一个线程在 catch 子句中写的行。并尝试在该线程中继续执行会话所需的所有操作。
这是我能想到的解决多个线程同时进行获取/创建相同的长类别路径(具有多个子父子关系行)的工作的唯一方法,并确保维护唯一约束。
但是休眠使 ConstraintViolationException 上的会话无效并最终引发断言异常(“com.stagirite.bean.Category 条目中的空 id(发生异常后不要刷新会话)”)所以我的解决方案是不可行的。
对于不创建重复行且不使用悲观锁的“获取/创建”模型,我将如何在整个应用程序中解决此问题?
安迪
【问题讨论】:
标签: mysql hibernate transactions pessimistic-locking