【问题标题】:jOOQ complex update - how to lock the table?jOOQ 复杂更新 - 如何锁定表?
【发布时间】:2012-01-06 15:38:42
【问题描述】:

这里是嵌套集合模型的“添加节点”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();

我应该如何锁定桌子?我应该吗?

谢谢

【问题讨论】:

    标签: sql jooq nested-set-model


    【解决方案1】:

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

    根据您的语法,我猜您正在使用 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

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多