如何在 Spring Data JPA 中禁用乐观锁定

2024-03-19

乐观锁注释不起作用。

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

and @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);

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


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

但是,只有当您继承了@Version来自基类的属性,其注释为@MappedSuperclass or @Inheritance.

对于您的情况,您可以简单地删除@Version属性(如果您不希望该实体使用乐观锁定)。然而,这通常是一个坏主意,因为它可能会导致丢失更新 https://vladmihalcea.com/preventing-lost-updates-in-long-conversations/.

也许你想使用无版本乐观锁 https://vladmihalcea.com/how-to-prevent-optimisticlockexception-using-hibernate-versionless-optimistic-locking/这可以降低由非重叠属性变更产生的冲突率。

再次,@Lock(LockModeType.NONE)没有用,因为它是默认暗示的。您也可以删除它。这只是为了获取显式逻辑或物理锁 https://vladmihalcea.com/a-beginners-guide-to-java-persistence-locking/.

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

因此,您需要以适当的方式提出问题,以便清楚:

  1. 您想要解决的实际问题是什么?
  2. 你想要乐观锁吗?
  3. 您在保存时是否遇到特殊异常?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Spring Data JPA 中禁用乐观锁定 的相关文章

随机推荐