JPA事务隔离和实体锁的区别
JPA difference between transaction isolation and entity locking
我已阅读有关事务隔离级别的内容。它用于防止并行事务执行错误。这很明显。
还有可用于实体的锁定模式。我了解它们的工作原理。
但是我找不到需要锁定的原因?我已经使用过事务隔离级别。为什么我必须使用锁定?
隔离级别和锁定是一样的吗?
简介
有不同的锁定类型和隔离级别。一些 locking types (OPTIMISTIC*) 是在 JPA 级别上实现的(例如在 EclipseLink 或 Hibernate 中),而其他 (PESSIMISTIC*) 则由 JPA 提供者委托给 DB 级别。
说明
隔离级别和锁定并不相同,但它们可能在某处相交。如果您具有 SERIALIZED 隔离级别(这是性能贪婪的),那么您不需要在 JPA 中执行任何锁定,因为它已经由 DB 完成。另一方面,如果您选择 READ_COMMITTED,那么您可能需要进行一些锁定,因为单独的隔离级别并不能保证您,例如,该条目不会同时被另一个事务更改。
事务隔离和JPA实体锁定都是并发控制机制。
transaction isolation is applied on a JDBC Connection level and the scope is the transaction life-cycle itself (you can't change the transaction isolation from your current running transactions). Modern databases allow you to use both 2PL (two-phase locking) isolation levels and MVCC 个(SNAPSHOT_ISOLATION 或 PostgreSQL 隔离级别)。在MVCC中,读者不阻塞写者,写者不阻塞读者(只有写者会阻塞写者)。
Java Persistence Locking API同时提供数据库级和应用程序级并发控制,可分为两类:
乐观锁定在 UPDATE/DELETE 语句中使用版本检查并在版本不匹配时失败。
显式悲观锁模式:
悲观锁模式使用特定于数据库的锁语法来获取读(共享)或写(独占)锁(例如SELECT ... FOR UPDATE)。
一个explicit lock mode is suitable when you run on a lower-consistency isolation level (READ_COMMITTED) and you want to acquire locks whose scope are upgraded from query life-time to a transaction life-time.
我已阅读有关事务隔离级别的内容。它用于防止并行事务执行错误。这很明显。 还有可用于实体的锁定模式。我了解它们的工作原理。
但是我找不到需要锁定的原因?我已经使用过事务隔离级别。为什么我必须使用锁定? 隔离级别和锁定是一样的吗?
简介
有不同的锁定类型和隔离级别。一些 locking types (OPTIMISTIC*) 是在 JPA 级别上实现的(例如在 EclipseLink 或 Hibernate 中),而其他 (PESSIMISTIC*) 则由 JPA 提供者委托给 DB 级别。
说明
隔离级别和锁定并不相同,但它们可能在某处相交。如果您具有 SERIALIZED 隔离级别(这是性能贪婪的),那么您不需要在 JPA 中执行任何锁定,因为它已经由 DB 完成。另一方面,如果您选择 READ_COMMITTED,那么您可能需要进行一些锁定,因为单独的隔离级别并不能保证您,例如,该条目不会同时被另一个事务更改。
事务隔离和JPA实体锁定都是并发控制机制。
transaction isolation is applied on a JDBC Connection level and the scope is the transaction life-cycle itself (you can't change the transaction isolation from your current running transactions). Modern databases allow you to use both 2PL (two-phase locking) isolation levels and MVCC 个(SNAPSHOT_ISOLATION 或 PostgreSQL 隔离级别)。在MVCC中,读者不阻塞写者,写者不阻塞读者(只有写者会阻塞写者)。
Java Persistence Locking API同时提供数据库级和应用程序级并发控制,可分为两类:
乐观锁定在 UPDATE/DELETE 语句中使用版本检查并在版本不匹配时失败。
显式悲观锁模式:
悲观锁模式使用特定于数据库的锁语法来获取读(共享)或写(独占)锁(例如SELECT ... FOR UPDATE)。
一个explicit lock mode is suitable when you run on a lower-consistency isolation level (READ_COMMITTED) and you want to acquire locks whose scope are upgraded from query life-time to a transaction life-time.