我有一个在事务中运行的java方法,其中我使用以下JPA查询读取Oracle数据库表,然后使用以下查询的结果在同一表中插入一个新记录。我想了解在这个场景中锁模式PESSIMISTIC_WRITE将如何工作。在执行以下查询时,整个表是否会被锁定,从而阻止对此表的其他读取,直到我的方法在insert之后提交事务?
@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"))发布于 2017-10-17 19:13:36
如果在查询中使用LockModeType.PESSIMISTIC_WRITE,则最终会在oracle上添加相当于Serializable隔离级别的级别。
在数据库级别上,只有与结果实体相对应的行才会被锁定,很少需要考虑:
ElementCollections和实体不包含前键的关系:@OneToMany,@ManyToMany;在默认情况下不会被锁定。ElementCollections指定了“javax.persistence.lock.scope”属性,则连接表中包含的实体所拥有的PessimisticLockScope.EXTENDED和关系将被锁定。https://stackoverflow.com/questions/46797178
复制相似问题