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

时间:2011-01-26 19:48:55

标签: hibernate locking unique unique-constraint

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

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

1 个答案:

答案 0 :(得分:1)

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

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