sql - jOOQ复杂更新-如何锁定表?

标签 sql jooq nested-set-model

这里是嵌套集合模型的“添加节点”SQL 查询

LOCK TABLE mytestdb.tbltree WRITE;

SELECT @myRight := rgt FROM mytestdb.tbltree
WHERE name = 'apples';

UPDATE mytestdb.tbltree SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE mytestdb.tbltree SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO mytestdb.tbltree(name, lft, rgt) 
VALUES('beans', @myRight + 1, @myRight + 2);

UNLOCK TABLES;   

以及到 jOOQ 的映射

Record record = create.select(Tbltree.RGT)
    .from(Tbltree.TBLTREE)
    .where(Tbltree.NAME.equal("apples"))
    .fetchOne();

int myright = record.getValue(Tbltree.RGT);

create.update(Tbltree.TBLTREE).set(Tbltree.RGT, Tbltree.RGT.add(2))
      .where(Tbltree.RGT.greaterThan(myright)).execute();

create.update(Tbltree.TBLTREE).set(Tbltree.LFT, Tbltree.LFT.add(2))
      .where(Tbltree.LFT.greaterThan(myright)).execute();

TbltreeRecord record2 = (TbltreeRecord) create 
    .insertInto(Tbltree.TBLTREE, Tbltree.NAME, Tbltree.LFT, Tbltree.RGT)
    .values("cherries",myright+1,myright+2)
    .returning(Tbltree.ID)
    .fetchOne();

我应该如何锁定表?我应该吗?

谢谢

最佳答案

我不太确定您的各种查询在做什么,所以我不知道您的情况是否需要显式表锁定。但我可以帮助您解决语法问题。

从你的语法来看,我猜测你正在使用 MySQL 作为底层数据库。您至少有三个选项可以将 SQL 转换为 jOOQ:

  1. 在 jOOQ 中也使用 MySQL LOCK TABLES 语句:

    try {
      create.execute("LOCK TABLES mytestdb.tbltree WRITE");
      // [...] your jOOQ code
    }
    
    // Be sure to unlock your tables again, in case of failure!
    finally {
      create.execute("UNLOCK TABLES");
    }
    
  2. 使用 FOR UPDATE 子句,该子句也由 SQL-1992 specification 指定(对于光标)。这个解决方案可能有点昂贵,因为 MySQL 实际上会为 Result 准备一个游标:

    create.selectFrom(TBLTREE).forUpdate().execute();
    
  3. 扩展 jOOQ 并为 LOCK TABLESUNLOCK TABLES 语句创建您自己的 org.jooq.Query

关于sql - jOOQ复杂更新-如何锁定表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274493/

相关文章:

sql - 有没有简单的方法来查询节点的子级?

php - 使用 MAX 和 GROUP BY 从表中提取数据

sql - 在 SQL 查询中使用内联函数和 CTE

mysql - 行排名之间的关系

java - Jooq 3.9.3 生成后删除自定义生成的java文件

postgresql - 在定期更改数据库密码时实现连接重建机制

java - jooq 配置调用 sp 时的输入参数

php - 从嵌套集模型结构为 Fancytree 创建 JSON

php - 带有巨大表的嵌套 mysql 查询