3

これは、ネストされたセット モデルの「ノードの追加」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();

テーブルをロックするにはどうすればよいですか? するべきか?

どうも

4

1 に答える 1

7

あなたのさまざまなクエリが何をしているのかよくわからないので、あなたの場合に明示的なテーブルロックが必要かどうかはわかりません. しかし、構文についてはお手伝いできます。

構文から、基礎となるデータベースとして MySQL を使用していると思います。SQL を jOOQ に変換するには、少なくとも 3 つのオプションがあります。

  1. LOCK TABLESjOOQ でもMySQLステートメントを使用します。

    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. SQL-1992 仕様(カーソル用)FOR UPDATEでも指定されている句を使用します。このソリューションは、MySQL が実際に.Result

    create.selectFrom(TBLTREE).forUpdate().execute();
    
  3. jOOQ を拡張し、 andステートメントorg.jooq.Query用に独自のものを作成します。LOCK TABLESUNLOCK TABLES

于 2011-11-26T10:15:53.480 に答える