ArangoDB事务 - 如何防止抛出异常

时间:2014-05-29 13:05:13

标签: transactions acid arangodb

如何在查找当时可能不存在的特定文档时,防止ArangoDB在事务期间抛出异常?

Nodejs将事务在一个块中发送到ArangoDb,在那里进行处理。那很完美。我想将所有数学卸载到服务器上。

在交易期间,我想查看一个特定的集合并检查文档是否存在,是否可以找到文档,然后获取字段“余额”,但如果找不到文档或其字段,那么我不想要抛出异常并且不想停止正在进行的事务。相反,我更希望继续进行事务处理,并为变量oldBalance指定字符串'0'。

(供您参考:有一个集合的写锁:在nodeJS端指定的'user') 在这里,您可以看到发送到ArangoDB的部分交易代码:

var db = require('internal').db;
// 1.) find specific document
var accountdoc = db.user.document('Johnny04'); // find doc by _key

如果找不到具有该特定_key的文档,则会抛出异常。那时用户可能没有集合中的条目。在这种情况下,我们希望将他的余额假设为字符串'0'。但不幸的是,已经抛出异常。我更想进行如下操作:

//2.) calculate newBalance = oldBalance + additional
        if (accountdoc.error==true){ // document not found etc...
            var oldBalance='0';
            var documentExists = false;
        } else {
            var oldBalance=accountdoc.balance;
            var documentExists = true;
            var documentExistsID = accountdoc._id;
        }   

1 个答案:

答案 0 :(得分:4)

无法处理事务中的“找不到文档”错误,如下所示:

function (params) {
  var db = require("org/arangodb").db;
  var accountdoc;

  // 1.) find specific document
  try {
    accountdoc = db.user.document('Johnny04'); // find doc by _key
  }
  catch (err) {
    // document not found etc.
    // TODO: rethrow exception if err is something different than "document not found"
  }

  // 2.) calculate newBalance = oldBalance + additional
  if (accountdoc === undefined) { // document not found etc...
    // create a new document with balance 0
    db.user.save({ _key: 'Johnny04', balance: '0' }); // note: if this fails, the transaction will throw
  } 
  else {
    // update the existing document
    var oldBalance = accountdoc.balance;
    var newBalance = oldBalance + 42;
    db.user.update('Johnny04', { balance: newBalance }); // note: if this fails, the transaction will throw
  }   
}