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