Транзакция в orientdb и ватерлинии

Я пытаюсь создать транзакцию в ватерлинии, но получаю эту ошибку от 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, но та же ошибка.


person 9me    schedule 24.03.2015    source источник


Ответы (1)


Вопрос в его нынешнем виде смешивает несколько разных концепций, я постараюсь рассмотреть одну за другой:

  1. Сам API Waterline не поддерживает транзакции (см. issue #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. В качестве альтернативы вы можете использовать транзакции в более стиле JavaScript, используя Oriento. Объект БД. Предполагая, что вы используете sails-orientdb, вы можете получить объект Oriento DB следующим образом:

    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.

person Dário    schedule 24.03.2015
comment
Извини. Я использую Waterline-OrientDB. - person 9me; 24.03.2015
comment
Привет @ Дарио, я пытаюсь следовать 4 варианту выше. но я получаю это исключение TypeError: undefined is not a function в этой строке var db = itemsModel.getDB(); - person 9me; 25.03.2015
comment
Привет, @9me, ты используешь последнюю версию waterline-orientdb? Кроме того, является ли itemsModel моделью, возвращаемой waterline.initialize()? Вы можете проверить рабочий пример .getDB() по этой ссылке: github.com/appscot/waterline-orientdb/blob/master/test/ - person Dário; 25.03.2015
comment
Привет @Dário, я использую global.WL_MODELS = все модели в app.js (основной файл), и я хочу получить объект БД, такой как WL_MODELS.users.getDB(), но я получил эту ошибку TypeError: undefined is not a function at module.exports.DbHelper.getDB (node_modules\waterline-orientdb\lib\connection.js:412:12) at module.exports.adapter.getDB (node_modules\waterline-orientdb\lib\adapter.js:343:38) at self.(anonymous function) [as getDB] (node_modules\waterline\lib\waterline\query\adapters.js:35:29) Что я делаю неправильно? - person 9me; 30.03.2015
comment
Какую версию Sails-OrientDB (она больше не называется Waterline-OrientDB) вы используете? Что касается ошибки, waterline-orientdb\lib\connection.js:412:12 находится в методе createEdge() (соединение. js:412). Либо вы не используете последнюю версию, либо ваша ошибка возникает где-то еще. - person Dário; 30.03.2015
comment
Я использую версию 0.10.42 - person 9me; 30.03.2015
comment
Это достаточно недавно, если вы посмотрите на код connection.js вокруг строка 412 вы увидите, что упомянутая вами ошибка исходит от .createEdge(), поэтому ваша проблема, похоже, связана не с .query(), а с чем-то другим... - person Dário; 30.03.2015