【发布时间】:2016-11-23 12:51:39
【问题描述】:
TL;DR 从 java 服务器使用远程 OrientDB 数据库时,如何使 SQL 命令在事务中执行?
加长版
我有一个从 java 服务器连接到的远程 OrientDB 数据库。
我在 OrientDB 文档中读到,要启动事务,我调用 db.begin(),在数据库更新后,我调用 db.commit() 或 db.rollback()。
所以这就是我最初想要做的:
try {
db.begin();
db.command(new OCommandSQL('delete edge connected from #10:1')).execute();
db.command(new OCommandSQL('create edge connected from #10:1 to BROKEN_SQL')).execute();
db.commit();
} catch (Throwable e) {
db.rollback();
}
那没用。它删除了边缘(在提交之前)。按预期在创建边缘线上抛出异常但没有回滚。然后我在文档中阅读了
NOTE: OrientDB keeps the transaction on client RAM
客户端内存;这意味着数据库服务器在调用db.commit() 之前完全不知道java 服务器在做什么。
这不是发生在我身上的事情,当单步执行代码时,每个命令确实在服务器上执行,db.begin() 和 db.rollback() 没有任何效果。然后我读了
SQL commands are always executed on the server side.
They don't care if you're in the middle of a transaction on the client side!
好的!这就解释了。所以我试试这个
try {
db.command(new OCommandSQL('begin')).execute();
db.command(new OCommandSQL('delete edge connected from #10:1')).execute();
db.command(new OCommandSQL('create edge connected from #10:1 to BROKEN_SQL')).execute();
db.command(new OCommandSQL('commit')).execute();
} catch (Throwable e) {
db.command(new OCommandSQL('rollback')).execute();
}
立即失败:
Request processing failed; nested exception is com.orientechnologies.orient.core.command.OCommandExecutorNotFoundException:
Cannot find a command executor for the command request: sql.begin
但是,我使用db.save(o) 或db.delete(o) 和交易确实取得了成功。一切似乎都与文档一致。但是我如何确保我的 SQL 命令 在事务中完成。我不在乎事务是在客户端还是服务器上。我已经尝试过 OrientDB 2.1.13、2.1.15 和 2.1.25。
【问题讨论】:
-
你试过最新版本(2.2.13)吗?
-
@AlessandroRota 我没有。从我在文档中看到的内容来看,没有理由相信他们已经改变了他们的设计。它是如何工作的不是错误,而是(尽管很奇怪)他们想要如何拥有它。或者你的意思是说有理由相信它的工作方式不同?
标签: java transactions orientdb