spring jOOQ中无记录乐观锁的正确处理方法

5vf7fwbs  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(99)

我想在我的项目中为并发请求实现乐观锁定。我使用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实体,或者版本延迟。
我将非常感谢任何关于如何正确实现此功能的建议或指导。

0yg35tkg

0yg35tkg1#

jOOQ自己的乐观锁实现并不区分这两种情况,因为这种区分是不相关的(并且很难在没有悲观锁的情况下使用单个查询来正确处理)。
为什么不相关?假设你不只是在传递随机ID,你拥有的ID一定在某个时候存在过,所以它不再存在的唯一原因是有人删除了记录。因此,这只是乐观锁定应该提升你的SomeException的另一种情况,与版本改变时没有太大区别。

相关问题