2017-07-19 10 views
1

更新:解決策が見つかりました。 ARANGODBクラスターは取引をサポートしていません。単一のインスタンスでのみサポートされています。ArangoDBトランザクションはエラー時にロールバックされません

私はarangoJSライブラリを使ってトランザクション関数を使用しようとしています。私が提示する関数は、2つのレコードを挿入し、存在しないドキュメントを取得しようとするダミー関数です。存在しない文書を取得するとエラーが発生し、トランザクションをロールバックする必要があります。実際、存在しないドキュメントを取得しようとした後にエラーが生成されます。ただし、データベースはロールバックされず、挿入された2つの文書はデータベースに挿入されたままです。誰もそれを解決する方法を知っていますか?

"updateCustomer" : function (options, cb) { 
    const action = String(function (params) { 
     // This code will be executed inside ArangoDB! 
     const db = require('@arangodb').db; 
     const aql = require('@arangodb').aql; 
     const customer = db._collection('customer'); 
     try{ 
      //insert two documents 
      db._query(aql`INSERT ${params.user} INTO ${customer} Return NEW`); 
      db._query(aql`INSERT ${params.customer} INTO ${customer} Return NEW`); 
      //Get a document that doesn't exist 
      customer.document('does-not-exist'); 
     }catch(e){ 
      throw new Error("Everything is bad"); 
     } 
    }); 
    let opts = { 
     collections : { 
      read : ["customer"], 
      write : ["customer"] 
     }, 
     action : action, 
     params : {user: options, customer: options}, 
     lockTimeout : 5 
    }; 
    Arango.transaction(opts,(err, result) => { 
     console.log("err: " + err); 
     console.log("result: " + JSON.stringify(result)); 
     return cb(err, result); 
    }); 
} 

"transaction" : function (options, cb) { 
    utils.dbConnect().transaction(options.collections, options.action, options.params, options.lockTimeout, cb); 
} 

UPDATE:私はこのトランザクションをArangoDBの1つのインスタンスで試してみました。ただし、クラスタでは機能しませんでした。 ArangoDBクラスタ上のトランザクションはサポートされていませんか?

答えて

0

単一のドキュメント操作は、arangodbクラスタでは不可分です。マルチドキュメントは現在のところありません。私たちは現在、複数文書操作のためのACIDに取り組んでいます。

関連する問題