在 JOOQ 中使用 NOWAIT 和 SKIP LOCKED 子句的解决方法

Posted

技术标签:

【中文标题】在 JOOQ 中使用 NOWAIT 和 SKIP LOCKED 子句的解决方法【英文标题】:Workaround for using NOWAIT and SKIP LOCKED clause in JOOQ 【发布时间】:2021-05-29 09:37:25 【问题描述】:

我正在使用 Jooq 进行数据库事务管理。我发现NOWAITSKIP LOCKED 子句仅在更高版本的 mysql 中受支持。在我使用的 MYSQL 版本中不支持它们。那么,在 JooQ 中,是否有解决方法可以解决这个问题?一个线程不等待锁定的实体并继续处理其他实体而不更改innodb_lock_wait_timeout DB 配置?

【问题讨论】:

【参考方案1】:

SKIP LOCKED 很难模拟,但使用 innodb_lock_wait_timeout 会话变量模拟 WAIT nNOWAIT 非常有意义。我们将在 jOOQ 3.15 中为 PostgreSQL 做这件事,所以为什么不为旧版本的 MySQL 做同样的事情:

https://github.com/jOOQ/jOOQ/issues/11243 (PostgreSQL) https://github.com/jOOQ/jOOQ/issues/11543(MariaDB、MySQL)

这将在 jOOQ 3.15 中提供

【讨论】:

谢谢卢卡斯。关于这个功能何时可用于开源版本的任何想法? @Picco:现在实施,这几天将发布 3.15。我没有意识到较新版本的 MySQL 还不支持 WAIT n 语法。这意味着在 MySQL 支持 WAIT n 之前,jOOQ 开源版也可以使用仿真。

以上是关于在 JOOQ 中使用 NOWAIT 和 SKIP LOCKED 子句的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Windows中的命名管道,FILE_FLAG_OVERLAPPED和PIPE_NOWAIT之间的区别

Django的锁和事务

JOOQ + JPA 实体

当我尝试使用 FOR UPDATE NOWAIT 时,MariaDB 抛出错误

在 Hibernate 事务中执行 jOOQ 语句

jOOQ - 在查询中简洁地表示列和聚合/窗口函数