hibernate防止更新时锁定记录

hibernate防止更新时锁定记录,hibernate,spring-data,database-locking,Hibernate,Spring Data,Database Locking,我在数据库中的每个用户上都有一个很长的过程,更新“分数”和“点击数”字段,在运行过程中,有时用户会尝试更新其姓名/电话等。此时,用户更新失败,原因是: org.springframework.dao.CannotAcquireLockException could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not exe

我在数据库中的每个用户上都有一个很长的过程,更新“分数”和“点击数”字段,在运行过程中,有时用户会尝试更新其姓名/电话等。此时,用户更新失败,原因是:

org.springframework.dao.CannotAcquireLockException
could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement
问题是,我知道用户不能更新他的分数/命中率字段,所以我可以防止行被锁定并允许两个更新都运行吗? (我正在使用hibernates@DynamicUpdate,因为我认为这会阻止锁定,因为查询只会更新更改的字段,但没有运气)

顺便说一句,我正在使用SpringBoot1.3.3.RELEASE和Java8(在tomcat中运行)

*更新*

为了回答@Thierry问题,我使用了一个大事务来更新所有用户的分数/点击数。我必须让所有用户立即更新。 而且我也不能阻止用户在这个过程运行时更新他们的记录,因为这将严重影响他们对系统的使用

*更新2*

因此,经过大量搜索,我想我找到了我想要的。根据这篇文章:,当我使用lock type dirty和dynamic update设置乐观锁时,然后:“这个替代方案允许其他并发进程更新相同的行,只要它们不修改相同的列。”问题是将我的实体设置为:

@DynamicUpdate
@OptimisticLocking(type = OptimisticLockType.DIRTY)
@Entity
public class User { ..

而且我仍然得到锁异常。我仍然做错了什么吗?

将更新的用户记录临时保存到另一个表中,并让另一个进程在长时间运行的进程完成后(也可能是长时间运行进程的最后一步)将此数据放入用户表中

当向用户显示配置文件页面(或用户可以更新记录的页面)时,必须在主用户表(可能已锁定)和其他表中的内容之间进行聚合


更新用户记录时,捕获CannotAcquireLockException,并将信息保存到回退表。

Iv'e更新了我的问题以回答您的问题。如果我想保留我的用户,您建议的第一个选项是不可能的。第二个选项听起来对我来说是一个坏习惯,我不太确定它是否会有帮助,因为在专业课结束时cess我仍然需要更新所有用户,这将需要一些时间来锁定记录。@Osher。好的,所以我看到的唯一解决方案是我回答的最后一部分:创建另一个表,在其中存储临时更新的记录。一旦运行完程,将它们提供给主用户表。当向用户显示配置文件页面时,您必须在主用户表(可能已锁定)和另一个表中的内容之间进行聚合。(我更新了答案,仅显示最后一部分,因为其余部分不再相关)。