【问题标题】:How to use transactions on remote OrientDB如何在远程 OrientDB 上使用事务
【发布时间】: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


【解决方案1】:

我找到了一个可能的解决方案。通过一些帮助类,它可能会扩大规模。

StringBuilder query = new StringBuilder();
query.append("begin\n");
things.forEach((thing) -> {
  query.append("delete edge owner from " + thing.getId() + "\n");
  query.append("create edge owner from " + thing.getId() + " to " + newOwner.getId() + "\n");
});
query.append("commit\n");

try {
  db.command(new OCommandScript(query)).execute()
} catch (Throwable t) {
  logger.error(t.toString());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2016-06-25
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多