我有一个名为客户的 hibernate 实体,其中包含有关客户的信息。在我的方法中,我将客户详细信息作为参数插入到数据库中。因此,要删除重复的条目,我正在检查该客户是否已存在于db中。但是问题是,如果同时使用相同的客户信息对同一方法进行两次调用,那么我将遇到约束冲突错误。我以为saveOrupdate()可以解决问题,但还没有解决。有人可以为这种情况提供解决方案吗?
最佳答案
saveOrUpdate用于完全不同的目的。它用于持久化可能已经持久化的实体(具有一个id和all),或者它可能是一个新的id。它与并发访问无关。
对于您的问题,有两种选择,称为乐观锁定和悲观锁定。
悲观锁:您在检查客户是否存在之前创建了一个锁,因此只有当前线程才能继续,它会进行检查并采取相应的措施。具有相同数据的任何其他线程将必须等待,直到第一个线程的更新或插入完成。该锁可以在数据库中实现,可以使用 hibernate 模式,也可以使用同步块(synchronized block)(如果您在单台计算机上运行)来实现。
乐观锁定:您可以像现在一样继续进行操作。但是,您放置了一个异常处理程序来处理您在问题中描述的冲突情况。
使用同步块(synchronized block)可能更容易实现悲观锁定,但它会严重影响性能和可伸缩性。
关于java - SaveOrUpdate中出现唯一约束违规错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12980217/