如何避免使用 Hibernate 遇到违反唯一约束的情况?

发布于 2024-10-14 14:15:29 字数 343 浏览 10 评论 0原文

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

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

I have a database table which has a unique constraint defined on one of its columns. I also have a message processing system with multiple threads. As the messages are being consumed, there could be times where two messages contain the same entity with the same value (the value of the column which has the unique constraint defined). So in the code, service layer first queries the database by using this unique field (via hibernate named query) to see if any records exists first. If not, then it inserts a new record. If a record with this unique field exists already, instead of inserting a record, it updates it and also inserts a child record in another table.

I am running into an issue in which the second thread thinks that the record is not there yet, so it tries to insert it in. However, by this time first thread already successfully inserted the record. So exception gets thrown about violation of the unique constraint. Can you help what is the best way to handle this kind of situation using hibernate/oracle solution? Do I need some sort of lock options? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故人爱我别走 2024-10-21 14:15:29

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

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

Trying to avoid rollback in this case goes against the spirit of MVCC (in particular, used by Oracle), since it requires excessive locking.

I think it would be better to react on rollback of insert by starting another transaction to perform update.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文