Hibernate 防止在更新时锁定记录
Hibernate prevent locking of records when updating
我有一个很长的过程 运行 我数据库中的每个用户并更新 score
和 hits
字段,虽然这是 运行ning,有时用户现在尝试更新他的 name/phone 等。当发生这种情况时,用户更新失败并显示:
org.springframework.dao.CannotAcquireLockException
could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement
问题是,我知道用户无法更新他的 score/hits 字段,所以我可以防止该行被锁定并允许对 运行 进行两次更新吗?
(我正在使用休眠 @DynamicUpdate
,因为我认为这会阻止锁定,因为查询只会更新更改的字段,但运气不好)
顺便说一句,我正在使用 spring boot 1.3.3.RELEASE 和 java 8,(运行ning 在 tomcat.
*** 更新 ***
为了回答@Thierry 的问题,我对所有用户分数/点击更新使用了一笔大交易。我必须立即更新所有用户。
而且我也不能阻止用户在这个过程中更新他们的记录运行,因为这会严重影响他们对系统的使用。
*** 更新 2 ***
经过大量搜索,我想我找到了我想要的东西。根据这篇文章:http://www.intertech.com/Blog/hibernate-optimistic-lock-without-a-version-or-timestamp/,当我将乐观锁设置为脏锁类型和动态更新时:“这种替代方法允许其他并发进程更新同一行,只要它们不修改相同的列。”事情是我将我的实体设置为:
@DynamicUpdate
@OptimisticLocking(type = OptimisticLockType.DIRTY)
@Entity
public class User { ..
而且我仍然得到锁定异常。我还是做错了什么?
将更新后的用户记录暂时保存到另一个 table,并在漫长的 运行 过程完成后让另一个过程将此数据放入您的用户 table(也可以是漫长 运行 过程的最后一步)。
向用户显示个人资料页面(或他可以更新记录的页面)时,您必须在主要用户 table(可能已锁定)和内部内容之间进行聚合另一个 table.
更新用户记录时,捕获 CannotAcquireLockException,并将信息保存到回退 table。
我有一个很长的过程 运行 我数据库中的每个用户并更新 score
和 hits
字段,虽然这是 运行ning,有时用户现在尝试更新他的 name/phone 等。当发生这种情况时,用户更新失败并显示:
org.springframework.dao.CannotAcquireLockException
could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement
问题是,我知道用户无法更新他的 score/hits 字段,所以我可以防止该行被锁定并允许对 运行 进行两次更新吗?
(我正在使用休眠 @DynamicUpdate
,因为我认为这会阻止锁定,因为查询只会更新更改的字段,但运气不好)
顺便说一句,我正在使用 spring boot 1.3.3.RELEASE 和 java 8,(运行ning 在 tomcat.
*** 更新 ***
为了回答@Thierry 的问题,我对所有用户分数/点击更新使用了一笔大交易。我必须立即更新所有用户。 而且我也不能阻止用户在这个过程中更新他们的记录运行,因为这会严重影响他们对系统的使用。
*** 更新 2 ***
经过大量搜索,我想我找到了我想要的东西。根据这篇文章:http://www.intertech.com/Blog/hibernate-optimistic-lock-without-a-version-or-timestamp/,当我将乐观锁设置为脏锁类型和动态更新时:“这种替代方法允许其他并发进程更新同一行,只要它们不修改相同的列。”事情是我将我的实体设置为:
@DynamicUpdate
@OptimisticLocking(type = OptimisticLockType.DIRTY)
@Entity
public class User { ..
而且我仍然得到锁定异常。我还是做错了什么?
将更新后的用户记录暂时保存到另一个 table,并在漫长的 运行 过程完成后让另一个过程将此数据放入您的用户 table(也可以是漫长 运行 过程的最后一步)。
向用户显示个人资料页面(或他可以更新记录的页面)时,您必须在主要用户 table(可能已锁定)和内部内容之间进行聚合另一个 table.
更新用户记录时,捕获 CannotAcquireLockException,并将信息保存到回退 table。