在jOOQ中处理没有记录的乐观锁定的正确方法

Correct way to deal with optimistic lock in jOOQ without records

提问人:Ilya 提问时间:11/15/2023 最后编辑:marc_sIlya 更新时间:11/20/2023 访问量:34

问:

我想在我的项目中为并发请求实现乐观锁定。我正在使用 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 的实体,或者版本延迟。

我将不胜感激有关如何正确实现此功能的任何建议或指导。

Java Spring Jooq 乐观锁定

评论


答:

0赞 Lukas Eder 11/15/2023 #1

jOOQ 自己的乐观锁定实现没有区分这两种情况,因为这种区别是无关紧要的(而且很难通过单个查询和悲观锁来正确理解)。

为什么它无关紧要?假设您不只是传递随机 ID,您拥有的 ID 一定在某个时候存在,因此它不再存在的唯一原因是有人删除了记录。因此,这只是乐观锁定应该提高你的另一种情况,与版本更改时没有太大区别。SomeException

评论

0赞 Ilya 11/16/2023
我同意,这听起来很合乎逻辑,谢谢!