2

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

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

4

1 回答 1

1

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

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

于 2011-01-26T20:26:58.537 回答