更新:解決策が見つかりました。 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クラスタ上のトランザクションはサポートされていませんか?