JPA 和缺省锁定模式

2022-09-01 18:52:00

使用JPA,我们可以使用手动或锁定来处理交易中的实体更改。OPTIMISTICPESSIMISTIC

我想知道如果我们不指定这2种模式之一,JPA如何处理锁定?没有使用锁定模式?

如果我们不定义显式锁定模式,数据库完整性是否会丢失?

谢谢


答案 1

我已经浏览了Java Persistence API 2.0最终发布规范的3.4.4锁定模式部分,虽然我找不到任何具体的东西(它没有说明这是默认值或类似的东西),但有一个脚注说以下内容。

锁定模式类型 NONE 可以指定为锁定模式参数的值,并且还为批注提供默认值。

本节介绍可用的 LockModeType 值的种类及其用法,并描述哪些方法采用此类参数以及不包含的参数。

所以,正如它所说,注释是默认的(JPA,左边和右边的注释),我想当你使用默认值时会被使用。LockModeType.NONEEntityManager.find(Class, Object)LockModeType

还有其他一些微妙的暗示来加强这一点。第 3.1.1 节 实体管理器接口

find 方法(前提是在没有锁的情况下调用它或使用 LockModeType.NONE 调用)和 getReference 方法不需要在事务上下文中调用。

这是有道理的。例如,如果您使用MySQL作为数据库,并且您选择的数据库引擎是InnoDB,那么(默认情况下)您的表将使用可重复的读取,如果您使用其他RDBMS或其他数据库引擎,则可能会发生变化。

现在我并不完全确定隔离级别是否与JPA锁定模式有关(尽管看起来是这样),但我的观点是,不同的数据库系统不同,因此JPA无法为您决定(至少根据规范)默认情况下使用哪种锁定模式,因此如果您不指示它,它将使用。LockModeType.NONE

我还找到了一篇关于隔离级别和锁定模式的文章,你可能想读一读。

哦,回答你的最后一个问题。

如果我们不定义显式锁定模式,数据库完整性是否会丢失?

要视情况而定,但如果您有并发事务,那么答案可能是肯定的。


答案 2

由于 JPA 2.1 FR

3.2 版本属性

持久性提供程序使用 Version 字段或属性来执行乐观锁定。它由持久性提供程序在实体实例上执行生命周期操作的过程中访问和/或设置。如果实体具有使用版本映射映射的属性或字段,则会自动为其启用乐观锁定。

因此,如果实体是受版本控制的对象(如已指定@Version),则默认持久性提供程序将执行乐观锁定。


推荐