我有一个在事务中运行的java方法,我使用以下JPA查询读取Oracle数据库表,然后使用以下查询的结果在同一个表中插入新记录。我想了解锁模式PESSIMISTIC_WRITE
在这种情况下的工作原理。执行以下查询时是否会锁定整个表,阻止此表中的其他读操作,直到我的方法在插入后提交事务为止?
@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"))
答案 0 :(得分:0)
如果对查询使用LockModeType.PESSIMISTIC_WRITE
,那么最终会在oracle db上添加等效的Serializable
隔离级别。
在数据库级别,只有与结果实体对应的行将被锁定,只需要考虑几件事情:
锁定实体包含外键的实体关系也将被锁定,但不会被锁定,但不会被引用实体的状态(除非明确锁定这些实体)。
ElementCollections
以及实体不包含foreigh key的关系:@OneToMany
,@ManyToMany
;默认情况下不会被锁定。
ElementCollections
并且如果' javax.persistence.lock.scope'将锁定连接表中包含的实体所拥有的关系。 property的值为PessimisticLockScope.EXTENDED
。