JPA中的乐观锁定它是如何工作的?
我了解什么是乐观锁定和“它是如何工作的”,但我不知道如何在JavaEE上实现它 我在JPA中有一个实体,我又添加了一个version列,并用JPA中的乐观锁定它是如何工作的?,jpa,jakarta-ee,ejb,Jpa,Jakarta Ee,Ejb,我了解什么是乐观锁定和“它是如何工作的”,但我不知道如何在JavaEE上实现它 我在JPA中有一个实体,我又添加了一个version列,并用@version对其进行了注释。但要实现乐观的锁定管理,我只需要@Version注释 这是我的Java类: @Entity public class MyClass implements Serializable { private static final long serialVersionUID = 1L; @Id @Gene
@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来访问实体类并持久化更多操作,因此默认情况下,我使用@TransactionManagement(TransactionManagementType.CONTAINER)
来处理我的事务
我的疑问是:
使用@TransactionManagement(TransactionManagementType.CONTAINER)
(独立于@TransactionAttribute
(必需、必需等))并仅在MyClass.java中注释版本
变量,我从以下位置获得乐观锁定管理?:
关于版本字段的几句警告已经准备就绪。第一个问题是它们不保证作为批量更新操作的一部分在托管实体或数据库中进行更新。(…)第二点值得记住的是,只有当非关系字段或拥有外键关系字段(例如,多对一和一对一源外键关系)被修改时,版本字段才会自动更新。(…)默认情况下,JPA假设(…)读提交隔离。使用版本锁定的正常执行与读提交隔离一起工作,以在面对交叉写入时提供额外的数据一致性检查。要满足比此锁定提供的更严格的锁定约束,需要使用额外的锁定策略
(强调矿山)
因此,请回答您的问题:否。使用@Version
并不能涵盖所有基础。
上述附加锁定策略涉及将适当的锁定模式(OPTIMISTIC
或OPTIMISTIC\u FORCE\u INCREMENT
)传递到EntityManager.lock()
、EntityManager.refresh()
、EntityManager.find()
和Query.setLockMode()
,如果适用。我不会在这里详细介绍,而是推荐一个(书中也有详细的讨论)