JPA中的乐观锁定如何工作?

时间:2018-06-27 18:12:41

标签: jpa java-ee ejb

我了解什么是乐观锁定和“它如何工作”,但是我不知道如何在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
}

在我的项目中,我使用无状态会话bean 来访问Entity类并执行更多操作,因此默认情况下,我使用@TransactionManagement(TransactionManagementType.CONTAINER)来处理事务。

我的疑问是: 与@TransactionManagement(TransactionManagementType.CONTAINER)(独立地是@TransactionAttribute(必需,强制等))并且仅在MyClass.java中注释version变量,我可以获得乐观的锁定管理吗?

1 个答案:

答案 0 :(得分:0)

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

  

有关版本字段的几个警告字是按顺序排列的。首先是不能保证在托管实体或数据库中对其进行更新作为批量更新操作的一部分。 (...)要记住的第二点是,仅当非关系字段或拥有外键关系字段(例如多对一和一个)时,版本字段才会自动更新-一对一源外键关系)已修改。 (...)默认情况下, JPA假定(...)读取已提交隔离。使用版本锁定的正常执行可与“读取提交”隔离一起使用,以在面对交错写入时提供其他数据一致性检查。要满足更严格的锁定约束,而不是此锁定提供,则需要使用其他锁定策略

(重点是我的)

因此,要回答您的问题:否。使用Lastrow = Worksheets("sheet1").Range("A" & Rows.Count).End(xlUp).Row不能涵盖所有基础。

上述其他锁定策略包括将适当的锁定模式(@VersionOPTIMISTIC)传递给OPTIMISTIC_FORCE_INCREMENTEntityManager.lock()EntityManager.refresh()和{{1 }}(如果适用)。在这里,我将不做更多详细介绍,而是推荐使用follow up read(这本书中也有详细的讨论)。