【问题标题】:How to disable optimistic locking in Spring Data JPA如何在 Spring Data JPA 中禁用乐观锁定
【发布时间】:2017-08-11 08:38:09
【问题描述】:

Optimistic Locking 注解不起作用。

@OptimisticLocking(type = OptimisticLockType.NONE)
public class TestEntity {
    ....
}

@Lock 注释也不起作用:

public interface TestRepository<TestEntity, Long> extends JpaRepository<Version, Long> {
    @Lock(LockModeType.NONE)
    TestEntity findByName(String name);
}

所以,我尝试调用:

entityManager.refresh();

它有效,但它是一种解决方法。

EntityManager em = sharedEntityManagerBean.getObject();
em.refresh(testEntity, LockModeType.OPTIMISTIC);
testRepository.save(testEntity);

你能告诉我为什么乐观锁注解不起作用以及用最新数据更新数据库行(实体)的最佳方法是什么?

【问题讨论】:

标签: java spring hibernate jpa spring-data-jpa


【解决方案1】:

OptimisticLockType.NONE 禁用TestEntity 的默认乐观锁定机制。

但是,只有当您从使用 @MappedSuperclass@Inheritance 注释的基类继承 @Version 属性时,这才有用。

在您的情况下,如果您不想对该实体进行乐观锁定,则可以简单地删除 @Version 属性。但是,这通常是个坏主意,因为它可能会导致 lost updates

也许您想使用versionless optimistic locking,它可以降低由非重叠属性更改产生的冲突率。

同样,@Lock(LockModeType.NONE) 是无用的,因为它是默认隐含的。您也可以删除它。这仅适用于acquiring an explicit logical or physical lock

您得出错误的结论,认为乐观锁定会导致您甚至没有描述的问题。

因此,您需要以适当的方式将问题表述清楚:

  1. 您要解决的实际问题是什么?
  2. 您是否想要乐观锁定?
  3. 您在进行保存时是否遇到特定异常?

【讨论】:

  • 我删除了@Version 属性,但实体锁定模式是乐观的。 --- 1.问题是多请求的乐观锁定异常。 2.不,我不想使用应用程序托管并发。 3.我在这种情况下上传了测试用例。 github.com/pilkyoon/optimisticlocking
  • 参考您的带有 MappedSuperclass 注释的示例,我注意到 Hibernate 4.3.0 之前的版本。如果父类具有 Version 注释属性,Final 会忽略 OptimisticLockType 配置。
  • 也许这是一个已修复的错误。
猜你喜欢
  • 2017-10-02
  • 2014-03-07
  • 2018-04-27
  • 2015-11-12
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多