jOOQ复杂更新-如何锁定表?
这是嵌套集模型的“添加节点”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();
我应该如何锁定表?我应该吗?
谢谢
here is a "add node" SQL query for nested set model
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;
and the mapping into 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();
How should I lock the table? Should I?
thx
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不太确定您的各种查询在做什么,所以我不知道您的情况是否需要显式表锁定。但我可以帮助你解决语法问题。
从你的语法来看,我猜测你正在使用 MySQL 作为底层数据库。您至少有三个选项可以将 SQL 转换为 jOOQ:
在 jOOQ 中也使用 MySQL
LOCK TABLES
语句:使用
FOR UPDATE
子句,该子句也由 SQL-1992 规范(针对游标)。这个解决方案可能有点昂贵,因为 MySQL 实际上会为Result
准备一个游标:扩展 jOOQ 并为
org.jooq.Query 创建您自己的
和org.jooq.Query
code>LOCK TABLESUNLOCK TABLES
语句。I'm not quite sure what your various queries are doing, so I don't know whether explicit table locking is necessary in your case. But I can help you with the syntax.
From your syntax, I'm guessing that you're using MySQL as the underlying database. You have at least three options to translate your SQL into jOOQ:
Use the MySQL
LOCK TABLES
statement also in jOOQ:Use the
FOR UPDATE
clause, which is also specified by the SQL-1992 specification (for cursors). This solution might be a bit expensive, as MySQL will actually prepare a cursor for theResult
:Extend jOOQ and create your own
org.jooq.Query
for theLOCK TABLES
andUNLOCK TABLES
statements.