【问题标题】:JPA difference between transaction isolation and entity lockingJPA 事务隔离和实体锁定的区别
【发布时间】:2015-08-26 21:30:50
【问题描述】:

我已阅读有关事务隔离级别的信息。它用于防止并行事务执行错误。它很明显。 实体也有可用的锁定模式。我了解它们的工作原理。

但我找不到需要锁定的原因?我已经使用了事务隔离级别。为什么我必须使用锁定? 隔离级别和锁定是否相同?

【问题讨论】:

  • 锁定也可以在数据库级别,这样Web应用程序之外的其他操作就不会修改数据库数据。
  • 那么当我在注释中使用事务隔离级别时,它是通过锁定来实现的吗?

标签: java database jpa concurrency transactions


【解决方案1】:

简介

有不同的锁定类型和隔离级别。一些locking types (OPTIMISTIC*) 在 JPA 级别(例如在 EclipseLink 或 Hibernate 中)实现,而其他 (PESSIMISTIC*) 由 JPA 提供者委托给 DB 级别。

解释

隔离级别和锁定并不相同,但它们可能会在某个地方相交。如果您具有 SERIALIZED 隔离级别(这是性能贪婪的),那么您不需要在 JPA 中执行任何锁定,因为它已经由 DB 完成。另一方面,如果您选择 READ_COMMITTED,那么您可能需要进行一些锁定,因为单独的隔离级别并不能保证您例如条目不会同时被另一个事务更改。

【讨论】:

  • 我认为,数据库隔离级别(包括 Serializable 在内的悲观锁定)无法扩展到典型的交互式 Web 应用程序,因为读取和写入通常是在单独的事务中完成的。它要求数据库连接和事务在整个编辑期间(从读取到写入)保持打开状态,这在交互式 Web 应用程序中是非常不受欢迎的。
【解决方案2】:

事务隔离和 JPA 实体锁定都是并发控制机制。

transaction isolation 应用于 JDBC 连接级别,范围是事务生命周期本身(您无法更改与当前正在运行的事务的事务隔离)。现代数据库允许您同时使用2PL (two-phase locking) 隔离级别和MVCC 隔离级别(SNAPSHOT_ISOLATION 或 PostgreSQL 隔离级别)。在 MVCC 中,reader 不会阻塞 writer,writer 不会阻塞 reader(只有 writer 会阻塞 writer)。

Java Persistence Locking API 提供数据库级和应用程序级并发控制,可分为两类:

  1. 显式乐观锁模式:

乐观锁定在 UPDATE/DELETE 语句中使用版本检查,并在版本不匹配时失败。

  1. 显式悲观锁模式:

悲观锁模式使用特定于数据库的锁语法来获取读取(共享)或写入(独占)锁(例如,SELECT ... FOR UPDATE)。

explicit lock mode 适用于在低一致性隔离级别 (READ_COMMITTED) 上运行并且您想要获取范围为 upgraded from query life-time to a transaction life-time 的锁。

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多