当前位置: 首页 > 面试题库 >

JPA和默认锁定模式

魏康安
2023-03-14
问题内容

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

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

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

谢谢


问题答案:

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

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

本节介绍了LockModeType可用值的种类及其用法,并介绍了哪些方法接受此类参数,而没有其他方法。

因此,正如它所说的那样LockModeType.NONE,注解是默认的(JPA,左右注解),我想应该在使用EntityManager.find(Class, Object)默认LockModeType值时使用。

还有其他一些 微妙的 提示可以加强这一点。3.1.1节 EntityManager接口

无需在事务上下文中调用find方法(假设它不带锁地调用或使用LockModeType.NONE调用)和getReference方法。

这说得通。例如,如果您使用MySQL作为数据库,而您选择的数据库引擎是InnoDB,那么(默认情况下)您的表将使用REPEATABLE READ,如果您使用其他RDBMS或其他数据库引擎,则可能会改变。

现在,我不能完全确定隔离级别是否与JPA锁定模式有关(尽管似乎是这样),但是我的观点是,不同的数据库系统有所不同,因此JPA无法为您做出决定(至少根据规范)默认使用哪种锁定模式,因此,LockModeType.NONE如果您没有其他说明,它将使用该模式。

我还找到了有关隔离级别和锁定模式的文章,您可能想阅读。

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

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

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



 类似资料:
  • 我在Oracle的博客上读到一篇关于JPA和锁定模式的文章。 我不完全理解和锁定模式类型之间的区别。 模式: 当用户选择这种模式时,他必须将EntityManager的状态flush()放到数据库中,以手动增加版本字段。因此,所有其他乐观事务都将失效(回滚)。在事务结束时还会对版本进行检查,以提交或回滚事务。 这似乎很清楚,但什么时候应该使用模式与模式?我看到的唯一标准是,当我希望事务优先于其他事

  • 我正在开发一个JPA应用程序,并且我正在使用eclipse链接提供程序。 我有一个表T1,其中有一个字段F1定义为非null,并且有一个默认值(“U”)。 我已经定义了一个映射到表T1的实体。该实体有一个映射到字段F1的属性,我已经用注释@ReturnInsert(returnOnly=true)配置了该属性。 文件说明: 使用@返回插入使INSERT操作将值返回到正在写入的对象中 如果在映射到F

  • 注意 当前章节中涉及的配置一般适用于关系数据库。这里展示的扩展方法在你安装了关系数据库提供程序之后就能获得(由Microsoft.EntityFrmeworkCore.Relational 程序包共享)。 默认模式是在未显示配置对象的数据库模式时其将被创建到的数据库模式。 惯例 按照惯例,数据库提供程序将会选择最合适的默认模式。比如,Microsoft SQL Server 会使用 dbo 模式,

  • 问题内容: 我正在将Lombok项目与Spring Data JPA一起使用。有什么方法可以将Lombok 与JPA默认构造函数连接? 码: 据我所知,JPA需要默认的构造函数,该构造函数被注解覆盖。有什么解决方法吗? 这段代码给我错误: 问题答案: 更新 根据反馈和John的回答,我已更新了不再使用or的答案,而是通过和创建访问器和变量,通过创建默认构造函数via,最后我们创建了构建器通过via

  • 我有一个关于Hibernate中乐观锁定的问题。我正试图深入乐观地锁定Hibernate,但我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,可以使用@Version注释(或xml配置)并创建版本属性。另一个选项是在不使用乐观lock=“all”属性进行版本控制的情况下进行配置。 我的问题是,如果你没有定义任何版本属性,也没有指定乐观锁属性,在这种情况下,哪种

  • 根据enable_if结构的定义: 我想知道怎么做 特别是: 在