这里是嵌套集合模型的“添加节点”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:
在 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"); }
使用
FOR UPDATE
子句,该子句也由 SQL-1992 specification 指定(对于光标)。这个解决方案可能有点昂贵,因为 MySQL 实际上会为Result
准备一个游标:create.selectFrom(TBLTREE).forUpdate().execute();
扩展 jOOQ 并为
LOCK TABLES
和UNLOCK TABLES
语句创建您自己的org.jooq.Query
。
关于sql - jOOQ复杂更新-如何锁定表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274493/