JPA锁定模式行为

时间:2017-10-17 18:47:17

标签: java oracle jpa openjpa

我有一个在事务中运行的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"))

1 个答案:

答案 0 :(得分:0)

如果对查询使用LockModeType.PESSIMISTIC_WRITE,那么最终会在oracle db上添加等效的Serializable隔离级别。

在数据库级别,只有与结果实体对应的行将被锁定,只需要考虑几件事情:

  • 锁定实体包含外键的实体关系也将被锁定,但不会被锁定,但不会被引用实体的状态(除非明确锁定这些实体)。

  • ElementCollections以及实体不包含foreigh key的关系:@OneToMany@ManyToMany;默认情况下不会被锁定。

  • ElementCollections并且如果' javax.persistence.lock.scope'将锁定连接表中包含的实体所拥有的关系。 property的值为PessimisticLockScope.EXTENDED