JPA在事务隔离和实体锁定之间的区别

时间:2015-06-11 09:15:53

标签: java database jpa concurrency transactions

我已阅读有关事务隔离级别的信息。它用于防止并行事务执行错误。很明显。 还有可用于实体的锁定模式。我明白他们是如何工作的。

但我找不到需要锁定的原因?我已经使用了事务隔离级别。为什么我必须使用锁定? 隔离级别和锁定能做同样的工作吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

  1. 明确的乐观锁定模式:

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

    1. 明确的悲观锁定模式:

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

      当您在较低一致性隔离级别(READ_COMMITTED)上运行并且您希望获取范围为explicit lock mode的锁时,upgraded from query life-time to a transaction life-time是合适的。

答案 1 :(得分:5)

简介

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

解释

隔离级别和锁定不一样,但它们可能会在某处交叉。如果你有SERIALIZED隔离级别(性能贪婪),那么你在JPA中不需要任何锁定,因为它已经由DB完成了。另一方面,如果你选择READ_COMMITTED,那么你可能需要进行一些锁定,因为单独的隔离级别不能保证你不会因为另一个事务而同时改变该条目。