加载实体而不锁定数据库中的行

收到

JPA中是否可以选择在不锁定数据库的情况下加载实体(或列表)?我希望能够通过几种方法做到这一点。JPA是否有可能在不锁定数据库的情况下加载实体,但是当该实体发生任何更改时,只是锁定了数据库中的行?当然,如果在数据库中已更改实体,则验证状态将引发无效状态的异常。

他妈的

JPA中是否可以选择在不锁定数据库的情况下加载实体(或列表)?

实体可以通过不同的EntityManager调用来加载:

  • EntityManager.find
  • EntityManager.createQuery
  • EntityManager.createNamedQuery
  • EntityManager.createNativeQuery

您无需LockModeType.None在这些调用中显式使用这是JPA中以表示的默认选项LockModeType.None

JPA是否有可能在不锁定数据库的情况下加载实体,但是当该实体发生任何更改时,只是锁定了数据库中的行?

实体可以通过不同的调用来锁定:

  • EntityManager.find
  • EntityManager.lock
  • EntityManager.refresh
  • Query.setLockMode

我想说这是可能的,但JPA不能保证,因为它取决于持久性提供程序(特定于供应商)和所使用的锁定类型。

无论如何,这种情况可能看起来像这样:

// begin tx
...
SomeEntity e = em.find(SomeEntity.class, id);
// change the entity
em.lock(e, LockModeType.OPTIMISTIC); // LockModeType.OPTIMISTIC_FORCE_INCREMENT
...
// commit tx

现在,是否持久锁定(调用锁定时)还是延迟锁定(在tx完成时)取决于持久性提供程序。请记住,另一笔交易会将实体锁定为第一笔交易,您最终将回滚。

JPA规范2.0的3.4.4.1OPTIMISTIC,OPTIMISTIC_FORCE_INCREMENT

如果事务T1调用lock(entity, LockModeType.OPTIMISTIC)版本对象,则实体管理器必须确保不会发生以下两种现象:

  • P1(脏读):事务T1修改一行。T2然后,另一个事务T1提交或回滚之前读取该行并获取修改后的值事务T2最终成功提交;T1提交或回滚以及在T2提交之前还是之后都这样做并不重要
  • P2(不可重复读取):事务T1读取一行。T2然后,另一个事务T1提交之前修改或删除该行两项交易最终都成功提交。

通常,这将通过实体管理器获取对基础数据库行的锁定来实现。尽管具有乐观并发性,但通常不会立即获得长期数据库读取锁定,但是允许兼容的实现方式获得立即锁定(只要保留该锁定直到提交完成即可)。如果将锁推迟到提交时间,则必须保留该锁,直到提交完成。允许以防止上述现象的方式支持可重复读取的任何实现都是允许的

如果事务T1调用lock(entity,LockModeType.OPTIMISTIC_FORCE_INCREMENT)版本对象,则实体管理器必须避免现象P1和P2(与一样LockModeType.OPTIMISTIC),并且还必须强制对实体的版本列进行更新(递增)。强制版本更新可以立即执行,也可以推迟到刷新或提交之前执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用实体框架核心在读取时锁定数据库行

来自分类Dev

如何从数据库中获取实体并锁定Doctrine ORM中的相应数据库行?

来自分类Dev

如何通过Qt锁定数据库中的表?

来自分类Dev

如何通过Qt锁定数据库中的表?

来自分类Dev

从数据库在Spring中写锁定实体

来自分类Dev

在SELECT INTO上锁定数据库

来自分类Dev

从站上的MySQL锁定数据库

来自分类Dev

锁定JPA上的实体或数据库

来自分类Dev

加载实体框架数据库连接后,Visual Studio 正在锁定

来自分类Dev

jpa实体不更新数据库中的关系操作

来自分类Dev

锁定数据库表n django的一些特殊行

来自分类Dev

为什么mysqli open transcation锁定数据库?

来自分类Dev

锁定数据库记录以进行编辑

来自分类Dev

在并发数据库更新时锁定实体框架代码

来自分类Dev

以表格形式加载数据并更新数据库中的行

来自分类Dev

在不锁定表的情况下防止在MySQL中同时进行数据库更新

来自分类Dev

防止在不锁定表的情况下在MySQL中同时进行数据库更新

来自分类Dev

使用PHP加载数据库中的1行,但

来自分类Dev

PHP不更新数据库中的行

来自分类Dev

PHP不更新数据库中的行

来自分类Dev

描述数据库中的实体

来自分类Dev

从数据库中删除隔离的实体

来自分类Dev

描述数据库中的实体

来自分类Dev

数据库中的实体关系图?

来自分类Dev

如何在不创建Symfony实体的情况下访问数据库中的不同表

来自分类Dev

从数据库加载的Symfony2实体属性

来自分类Dev

使用从数据库加载的多个休眠实体

来自分类Dev

Spring Boot无法从本地MySQL数据库加载实体

来自分类Dev

SQLite 内存数据库急切加载实体

Related 相关文章

热门标签

归档