4

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

4

2 回答 2

5

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

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

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

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

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

于 2012-10-19T18:34:01.890 回答
3

saveOrUpdate作用于对象中的主键属性值,例如,如果0是新对象的默认值,并且您的新customer对象设置了主键属性,0那么它将始终尝试保存(插入)并且从不尝试更新。只有当主键属性为非零值时,它才会尝试更新。这就是saveOrUpdate没有解决您的问题的原因。

我不确定你能做些什么比处理unique约束异常更好。

于 2012-10-19T18:31:09.930 回答