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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用hibernate避免遇到违反唯一约束的问题?相关的知识,希望对你有一定的参考价值。

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

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

答案

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

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

以上是关于如何使用hibernate避免遇到违反唯一约束的问题?的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.exception.ConstraintViolationException:违反唯一约束条件,求大侠指点

JAVA hibernate中删除表遇到主键被外键引用,违反完整约束条件,不能删除的问题 2张表,一张主表user,有

Hibernate 两次将数据插入到 Join Table 中,导致 Spring Boot 项目中出现“ORA-00001:违反唯一约束”

“ORA-00001:违反了唯一约束”,即使使用异常

填充行的其余部分/避免违反空约束

如何避免使用 JPA 在实体关系中违反外键约束