Java Spring数据JPA+;Hibernate:乐观锁定未按预期工作

Java Spring数据JPA+;Hibernate:乐观锁定未按预期工作,java,spring,hibernate,jpa,optimistic-locking,Java,Spring,Hibernate,Jpa,Optimistic Locking,我有一个关于spring数据jpa和hibernate的乐观锁定的问题。我知道不同锁定类型的理论背景以及乐观锁定应该如何工作,但即使是一个简单的测试也不会抛出任何锁定异常 我有一个具有版本属性的简单实体: @Entity @Table( name = "DOK_AUDIT", schema = "ORACLE" ) @SuppressWarnings( "unused" ) public class DocAudit { @I

我有一个关于spring数据jpa和hibernate的乐观锁定的问题。我知道不同锁定类型的理论背景以及乐观锁定应该如何工作,但即使是一个简单的测试也不会抛出任何锁定异常

我有一个具有版本属性的简单实体:

@Entity
@Table( name = "DOK_AUDIT", schema = "ORACLE" )
@SuppressWarnings( "unused" )
public class DocAudit {

    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY )
    @Column( name = "AUDIT_ID" )
    private Long id;

    ...
    @Version
    @Column( name = "VERSION" )
    private Long version;

    @Column( name = "CHANGE_USER" )
    private String changeUser;
}
我创建了一个简单的事务服务方法,其中一行应该被更新

@Transactional
public void changeWithId(final Long auditId) {
    Preconditions.checkArgument(auditId != null, "auditId can't be null");

    final DocAudit auditById = auditRepository.getAuditById(auditId);
    auditById.setName("xxx");
}
现在,在事务提交和update语句将被执行之前,我在函数的最后一行添加了一个调试器断点

当调试器到达这一点时,我更改数据库中的行并增加版本。 现在,当恢复应用程序时,我可以看到update语句将被执行,并且它在where子句中使用了correctedversion列

update oracle.dok_audit set version=?, change_user=?, audit_name=?, audit_start_date=? where audit_id=? and version=?
由于where子句与数据库中的任何行都不匹配,update语句返回0(未更改任何行),但不会引发ObjectOptimiitClockingException

据我所知,hibernate/spring数据存储库现在应该抛出此异常,因为版本不匹配和更新不会影响任何行

我错过了什么

当我对不同的事务执行读取和更新时,将发生乐观锁交换。在下面的示例中,我在save fg函数之前添加了一个断点,并再次更改了数据库中的版本

// getAuditById is transactional
final DocAudit audit = auditService.getAuditById(2L);
audit.setName("changed");
// save audit is another transaction
auditService.saveAudit(audit);
当我现在用这个分离的实体调用saveAudit(它调用存储库的save函数)时,实体管理器必须合并分离的实体。从数据库中选择实体以将其重新附加到上下文时,由于版本不匹配,将引发optimistick锁异常

这没关系,但为什么在第一个示例中,在一个事务中更改实体时,锁定不起作用

谢谢
塞巴斯蒂安

没人能回答我吗(