我想在我的项目中为并发请求实现乐观锁定。我使用Java 17,Spring和jooq。在阅读文档时,我发现jOOQ支持开箱即用的乐观锁定,但我决定自己实现它,因为我不想使用jooq记录(我是JdbcTemplate
的高手,我真的很喜欢这种写持久层的方式)结果,我用一个版本列扩展了我的表,当更新一个实体时,我检查版本没有不同,并递增版本。
主要的问题是我不明白如何正确处理异常。当更新时,我想知道哪里出错了:我们没有找到实体,或者版本不同。
现在,我在我的更新方法中有这样的东西:
public void update(SomeEntity value) throws SomeException {
boolean isUpdated = dsl.update(TABLE_NAME)
.set(TABLE_NAME.FIELD1, value.getField1())
.set(TABLE_NAME.LAST_UPDATE, OffsetDateTime.now())
.set(TABLE_NAME.VERSION, TABLE_NAME.VERSION.add(1))
.where(TABLE_NAME.ID.eq(value.getId())
.and(TABLE_NAME.VERSION.eq(value.getVersion())))
.execute() > 0;
if (!isUpdated) {
throw new SomeException();
}
}
字符串
在这种情况下,我不明白出了什么问题:没有这样的id实体,或者版本延迟。
我将非常感谢任何关于如何正确实现此功能的建议或指导。
1条答案
按热度按时间0yg35tkg1#
jOOQ自己的乐观锁实现并不区分这两种情况,因为这种区分是不相关的(并且很难在没有悲观锁的情况下使用单个查询来正确处理)。
为什么不相关?假设你不只是在传递随机ID,你拥有的ID一定在某个时候存在过,所以它不再存在的唯一原因是有人删除了记录。因此,这只是乐观锁定应该提升你的
SomeException
的另一种情况,与版本改变时没有太大区别。