Java JPA锁模式行为

Java JPA锁模式行为,java,oracle,jpa,openjpa,Java,Oracle,Jpa,Openjpa,我在事务中运行了一个java方法,我使用下面的JPA查询读取Oracle数据库表,然后使用下面查询的结果在同一个表中插入一条新记录。我想了解锁模式悲观写入在这种情况下是如何工作的。当执行以下查询时,是否会锁定整个表,阻止从此表进行其他读取,直到我的方法在insert后提交事务 @NamedQuery(name = "findByMaxSeqForGivenOrd", query = "select ar from Remark ar where ar.sequenceNumber =

我在事务中运行了一个java方法,我使用下面的JPA查询读取Oracle数据库表,然后使用下面查询的结果在同一个表中插入一条新记录。我想了解锁模式
悲观写入
在这种情况下是如何工作的。当执行以下查询时,是否会锁定整个表,阻止从此表进行其他读取,直到我的方法在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"))

如果在查询中使用
LockModeType.eposistic\u WRITE
,那么最终会在oracle db上添加一个与
Serializable
隔离级别相当的级别

在数据库级别上,只锁定与结果实体对应的行,无需考虑以下事项:

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

  • ElementCollections
    和实体不包含外键的关系:
    @OneToMany
    @ManyToMany
    ;默认情况下不会锁定

  • 如果“javax.persistence.lock.scope”属性是用值
    悲观锁scope.EXTENDED
    指定的,则连接表中包含的实体所拥有的
    ElementCollections
    和关系将被锁定


谢谢。所以,如果我的表有orderNum和seqNum列以及三条记录(1,1),(1,2),(2,1),我使用原始问题中的查询来查找orderNum 1的max(seqNum)记录,它将返回(1,2),那么在这种情况下,另一个运行相同orderNum 1查询的事务将等待第一个事务提交?插页呢?其他事务是否能够为相同的orderNum:1插入新行?t2将根据超时设置等待。。而且你不能插入具有相同pk的新行。很抱歉。我的意思是插入不同的PK。我正在读的是生成新的序列号。我有一个现有的表,其中orderNum和SeqNum是PK的一部分。对于新的orderNum,SeqNum重置为1。该表当前正由Pro*c代码访问,现在我必须使用JPA。我找不到一个PK生成策略,我可以在这种情况下使用。这似乎是一个不同的职位的情况。底线是其他事务将能够使用该锁定模式读取或更新查询实体您的意思是其他事务将无法读取或更新吗?或者我误解了第二条评论,您提到t2将根据超时情况等待?