如何使用hibernate避免遇到违反唯一约束的问题?

问题描述 投票:2回答:1

我有一个数据库表,其中一个列上定义了唯一约束。我还有一个带有多个线程的消息处理系统。在消息被消耗时,有时可能有两个消息包含具有相同值的相同实体(定义了唯一约束的列的值)。因此,在代码中,服务层首先使用此唯一字段(通过hibernate命名查询)查询数据库,以查看是否存在任何记录。如果没有,则插入新记录。如果已存在具有此唯一字段的记录,则不会插入记录,而是更新记录,并在另一个表中插入子记录。

我遇到了一个问题,其中第二个线程认为该记录还没有,所以它试图将其插入。但是,此时第一个线程已经成功插入记录。因此违反唯一约束会抛出异常。你能帮助使用hibernate / oracle解决方案来处理这种情况的最佳方法吗?我需要某种锁定选项吗?谢谢。

hibernate locking unique unique-constraint
1个回答
1
投票

在这种情况下,试图避免回滚违背了MVCC的精神(特别是由Oracle使用),因为它需要过多的锁定。

我认为最好通过启动另一个事务来执行更新来对插入回滚作出反应。

© www.soinside.com 2019 - 2024. All rights reserved.