【问题标题】:Optimistic locking in JPA how does it work?JPA 中的乐观锁是如何工作的?
【发布时间】:2018-07-06 21:23:43
【问题描述】:

我了解什么是乐观锁定以及“它是如何工作的”,但我不知道如何在 Java EE 上实现它。

我在 JPA 中有一个实体,我又添加了一个 version 列,并用 @Version 对其进行了注释。但是要进行乐观的锁定管理,我只需要 @Version 注释吗?

这是我的 Java 类:

@Entity
public class MyClass implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    //other variables
    @Version
    @Column(name = "version")
    private int version;
 //other code
}

在我的项目中,我使用Stateless session bean来访问Entity类并持久化更多操作,所以我默认使用@TransactionManagement(TransactionManagementType.CONTAINER)来处理我的事务。

我的疑问是: 使用@TransactionManagement(TransactionManagementType.CONTAINER)(独立于什么是@TransactionAttribute(必需、强制等))并且只在MyClass.java 中注释version 变量我获得了乐观锁定管理?

【问题讨论】:

    标签: jpa jakarta-ee ejb


    【解决方案1】:

    来自Pro JPA 2: Mastering the Java™ Persistence API

    关于版本字段的几句警告是有序的。首先是不保证它们会在托管实体或数据库中更新作为批量更新操作的一部分。 (...) 值得记住的第二点是版本字段将仅在非关系字段或拥有外键关系字段时自动更新(例如,多对一和一一对一源外键关系)已修改。 (...) 默认情况下,JPA 假定 (...) 已提交读 隔离。使用版本锁定的正常执行与 Read Committed 隔离一起使用,以在面对交错写入时提供额外的数据一致性检查。满足比此锁定提供的更严格的锁定约束需要使用额外的锁定策略

    (强调我的)

    所以,回答你的问题:不。使用@Version 并没有涵盖所有的基础。

    上述附加锁定策略包括将适当的锁定模式(OPTIMISTICOPTIMISTIC_FORCE_INCREMENT)传递给EntityManager.lock()EntityManager.refresh()EntityManager.find()Query.setLockMode()(如果适用)。此处不再赘述,推荐follow up read(书中也有详细讨论)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2018-07-30
      相关资源
      最近更新 更多