SaveOrUpdate 中的唯一约束违反错误

Nam*_*man 4 java multithreading hibernate unique-constraint

我有一个名为 customer 的休眠实体,其中包含有关客户的信息。在我的方法中,我将客户详细信息作为需要插入数据库的参数。因此,要删除重复条目,我会检查该客户是否已存在于 db 中。但问题是,如果在同一时刻使用相同的客户信息对相同的方法进行两次调用,那么我会收到违反约束的错误。我认为 saveOrupdate() 会解决这个问题,但它没有。有人可以为这种情况提出解决方案。

Jen*_*der 5

saveOrUpdate 用于完全不同的目的。它用于持久化一个实体,它可能已经被持久化(有一个 id 和所有的)或者它可能是一个新的 id。它与并发访问无关。

对于您的问题,有两种选择,称为乐观锁定和悲观锁定。

悲观锁:在检查客户是否存在之前创建一个锁,所以只有当前线程可以继续,它会进行检查并采取相应的行动。任何其他带有相同数据的线程都必须等到第一个线程的更新或插入完成。如果您在单台机器上运行,可以使用休眠或简单的同步块在数据库中实现锁。

乐观锁定:你就像现在一样继续前进。但是您放置了一个异常处理程序来处理您在问题中描述的冲突情况。

使用同步块可能更容易实现悲观锁定,但它会影响性能和可伸缩性。