0

我正在尝试在水线中创建事务,但我从 OrientDB 收到此错误:

com.orientechnologies.orient.core.command.OCommandExecutorNotFoundException: Cannot find a command executor for the command request: sql.BEGIN

这是我的代码:

 try {
  itemsModel.query("BEGIN", function(err) { if (err) {throw new Error(err);}
    itemsModel.update({id:items_ids,status:ACTIVE},{status:INACTIVE})
      .exec(function(err, INA_items){ if (err) {throw new Error(err);}
        if (INA_items.length != items_ids.length ) {throw new Error({err:RECORD_NOT_FOUND});}
        itemsModel.query("COMMIT", function(err) { if (err) {throw new Error({err:MSG.RECORD_NOT_FOUND,title:"ITEMS"});} });
      });
  });
}
catch(e){
  itemsModel.query("ROLLBACK", function(err) { 
    if (err) {return res.serverError(err);}
    return res.serverError(e);  
  });
}

我还BEGIN直接在 orientdb 中检查了命令,但同样的错误。

4

1 回答 1

1

目前的问题是混合了几个不同的概念,我将尝试一一解决:

  1. Waterline 的 API 本身不支持事务(检查问题 #755);

  2. 看起来您正在使用sails-orientdb适配器,并从中执行原始SQL 查询;

  3. 您在示例的第二行中执行的 SQL 查询只是BEGIN,这就是 OrientDB 本身引发错误的地方。事务 SQL 查询必须类似于:

    begin
    let account = create vertex Account set name = 'Luke'
    let city = select from City where name = 'London'
    let edge = create edge Lives from $account to $city
    commit retry 100
    return $edge
    

    示例取自OrientDB 文档

  4. 或者,您可以通过使用Oriento DB 对象以更javascript 样式使用事务。假设您正在使用,您可以获得这样的 Oriento DB 对象:sails-orientdb

    var db = itemsModel.getDB();
    
    // using oriento syntax, you can do something like
    var tx = db.begin();
    tx.create({
      '@class': 'TestClass',
      name: 'item3'
    });
    return tx.commit()
    .then(function (results) {
      console.log(results.created.length);  // should be 1
    });
    

    取自Oriento 测试的示例。另一个很好的例子可以在Oriento 的示例文件夹中找到。

于 2015-03-24T17:04:31.560 回答