我对JPA中LockModeTypes的工作感到困惑:
LockModeType.Optimistic
LockModeType.OPTIMISTIC_FORCE_INCREMENT
LockModeType
的用途是什么。 LockModeType.PESSIMISTIC_READ
select for update nowait
(如果未指定提示超时).. Read
锁? LockModeType.PESSIMISTIC_WRITE
select for update nowait
(如果未指定提示超时)。LockModeType.PESSIMISTIC_READ
之间有什么区别,因为我看到它们同时触发相同的查询? LockModeType.PESSIMISTIC_FORCE_INCREMENT
select for update nowait
(如果没有指定提示超时)并且还会增加版本号。for update no wait
存在,为什么需要增加版本?答案 0 :(得分:22)
我首先要区分乐观锁和悲观锁,因为它们的底层机制不同。
乐观锁定完全由JPA控制,只需要DB表中的其他版本列。它完全独立于用于存储关系数据的底层数据库引擎。
另一方面,悲观锁定使用底层数据库提供的锁定机制来锁定表中的现有记录。 JPA需要知道如何触发这些锁,而某些数据库不支持它们或仅部分支持它们。
现在到锁类型列表:
LockModeType.Optimistic
示例:
LockModeType lockMode = resolveLockMode();
A a = em.find(A.class, 1, lockMode);
LockModeType.OPTIMISTIC_FORCE_INCREMENT
LockModeType.PESSIMISTIC_READ
LockModeType.PESSIMISTIC_WRITE
,但在一件事情上有所不同:直到某个事务对同一实体执行写锁定,它不应阻止读取实体。它还允许使用LockModeType.PESSIMISTIC_READ
锁定其他事务。 WRITE和READ锁之间的区别很好地解释了here (ObjectDB)和here (OpenJPA)。 LockModeType.PESSIMISTIC_WRITE
LockModeType.PESSIMISTIC_READ
的更强版本。当WRITE
锁定到位时,JPA在数据库的帮助下将阻止任何其他事务读取实体,而不是像READ
锁一样写。READ
锁的东西。 SELECT...FOR UPDATE
实际上是一个WRITE
锁。它可能是休眠中的一个错误,或者仅仅是一个决定,而不是实现自定义的“更软”READ
锁定,而是使用“更难”WRITE
锁。这主要不会破坏一致性,但不会保留所有带READ
锁的规则。您可以使用READ
锁和长时间运行的事务运行一些简单的测试,以确定是否有更多事务能够在同一实体上获取READ
锁。这应该是可能的,而不是WRITE
锁。LockModeType.PESSIMISTIC_FORCE_INCREMENT
PESSIMISTIC
和OPTIMISTIC
机制。在以下场景中使用普通PESSIMISTIC_WRITE
会失败:
LockModeType.PESSIMISTIC_FORCE_INCREMENT
将强制事务B更新版本号并导致事务A失败并{{1} 1}},即使B使用悲观锁定。