JPA 锁定模式行为
JPA Lock Mode behaviour
我在事务中有一个 java 方法 运行,我使用以下 JPA 查询读取 Oracle 数据库 table,然后在同一个 table 中插入一条新记录使用以下查询的结果。我想了解锁定模式 PESSIMISTIC_WRITE
在这种情况下如何工作。执行以下查询时,整个 table 是否会被锁定,从而阻止来自此 table 的其他读取,直到我的方法在插入后提交事务?
@NamedQuery(name = "findByMaxSeqForGivenOrd", query = "select ar from Remark ar
where ar.sequenceNumber = (select max(ar1.remarkId.sequenceNumber) from Remark ar1
where ar1.remarkId.orderNum = ar.remarkId.orderNum
AND ar1.remarkId.orderNum=:orderNum)",
lockMode=LockModeType.PESSIMISTIC_WRITE,
hints = @QueryHint( name = "javax.persistence.lock.timeout", value =
"3000"))
如果您在查询中使用 LockModeType.PESSIMISTIC_WRITE
,那么您最终会在 Oracle 数据库上添加相当于 Serializable
隔离级别。
在数据库级别,只有与结果实体对应的行将被锁定,需要考虑的事情很少:
锁定实体包含外键的实体关系也将被锁定,但不会锁定引用实体的状态(除非这些实体被明确锁定)。
ElementCollections
和实体不包含外键的关系:@OneToMany
、@ManyToMany
;默认不锁定
ElementCollections
如果 'javax.persistence.lock.scope' 属性 指定了一个值 PessimisticLockScope.EXTENDED
.
我在事务中有一个 java 方法 运行,我使用以下 JPA 查询读取 Oracle 数据库 table,然后在同一个 table 中插入一条新记录使用以下查询的结果。我想了解锁定模式 PESSIMISTIC_WRITE
在这种情况下如何工作。执行以下查询时,整个 table 是否会被锁定,从而阻止来自此 table 的其他读取,直到我的方法在插入后提交事务?
@NamedQuery(name = "findByMaxSeqForGivenOrd", query = "select ar from Remark ar
where ar.sequenceNumber = (select max(ar1.remarkId.sequenceNumber) from Remark ar1
where ar1.remarkId.orderNum = ar.remarkId.orderNum
AND ar1.remarkId.orderNum=:orderNum)",
lockMode=LockModeType.PESSIMISTIC_WRITE,
hints = @QueryHint( name = "javax.persistence.lock.timeout", value =
"3000"))
如果您在查询中使用 LockModeType.PESSIMISTIC_WRITE
,那么您最终会在 Oracle 数据库上添加相当于 Serializable
隔离级别。
在数据库级别,只有与结果实体对应的行将被锁定,需要考虑的事情很少:
锁定实体包含外键的实体关系也将被锁定,但不会锁定引用实体的状态(除非这些实体被明确锁定)。
ElementCollections
和实体不包含外键的关系:@OneToMany
、@ManyToMany
;默认不锁定ElementCollections
如果 'javax.persistence.lock.scope' 属性 指定了一个值PessimisticLockScope.EXTENDED
.