eat*_*ode 15 oracle concurrency hibernate jpa transactions
我对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
?Ond*_*Mih 30
我首先要区分乐观锁和悲观锁,因为它们的底层机制不同.
乐观锁定完全由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
.这里(ObjectDB)和这里(OpenJPA)很好地解释了 WRITE和READ锁之间的区别.javax.persistence.lock.timeout
LockModeType.PESSIMISTIC_WRITE
.当LockModeType.PESSIMISTIC_READ
锁定到位时,JPA在数据库的帮助下将阻止任何其他事务读取实体,而不仅仅是写入WRITE
锁定.READ
锁的东西.READ
真是个SELECT...FOR UPDATE
锁.它可能是休眠中的一个错误或只是一个决定,而不是实现自定义的"更软" WRITE
锁定,READ
而是使用"更难"的锁.这主要不会破坏一致性,但不会保留所有WRITE
带锁的规则.您可以使用READ
锁和长时间运行的事务运行一些简单的测试,以确定是否有更多事务能够获取READ
同一实体上的锁.这应该是可能的,而不是READ
锁.LockModeType.PESSIMISTIC_FORCE_INCREMENT
WRITE
和PESSIMISTIC
机制的选项.OPTIMISTIC
在以下场景中使用plain 会失败:
PESSIMISTIC_WRITE
将强制事务B更新版本号并导致事务A失败LockModeType.PESSIMISTIC_FORCE_INCREMENT
,即使B使用悲观锁定. 归档时间: |
|
查看次数: |
11825 次 |
最近记录: |