我了解什么是乐观锁定和“它如何工作”,但是我不知道如何在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
变量,我可以获得乐观的锁定管理吗?
答案 0 :(得分:0)
来自Pro JPA 2: Mastering the Java™ Persistence API:
有关版本字段的几个警告字是按顺序排列的。首先是不能保证在托管实体或数据库中对其进行更新,作为批量更新操作的一部分。 (...)要记住的第二点是,仅当非关系字段或拥有外键关系字段(例如多对一和一个)时,版本字段才会自动更新-一对一源外键关系)已修改。 (...)默认情况下, JPA假定(...)读取已提交隔离。使用版本锁定的正常执行可与“读取提交”隔离一起使用,以在面对交错写入时提供其他数据一致性检查。要满足更严格的锁定约束,而不是此锁定提供,则需要使用其他锁定策略。
(重点是我的)
因此,要回答您的问题:否。使用Lastrow = Worksheets("sheet1").Range("A" & Rows.Count).End(xlUp).Row
不能涵盖所有基础。
上述其他锁定策略包括将适当的锁定模式(@Version
或OPTIMISTIC
)传递给OPTIMISTIC_FORCE_INCREMENT
,EntityManager.lock()
,EntityManager.refresh()
和{{1 }}(如果适用)。在这里,我将不做更多详细介绍,而是推荐使用follow up read(这本书中也有详细的讨论)。