Java Spring数据JPA+;Hibernate:乐观锁定未按预期工作
我有一个关于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
@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锁异常
这没关系,但为什么在第一个示例中,在一个事务中更改实体时,锁定不起作用
谢谢
塞巴斯蒂安没人能回答我吗(