orientdb 和 waterline 中的事务
Transaction in orientdb and waterline
我正在尝试在水线中创建事务,但我从 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);
});
}
我也在orientdb中直接检查了BEGIN
命令,但同样的错误。
目前的问题是混合了几个不同的概念,我将尝试一一解决:
水线的API本身不支持交易(勾选issue #755);
看起来您正在使用 sails-orientdb
适配器,并且您正在从中执行 raw SQL 查询;
您在示例的第二行中执行的 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 docs。
或者,您可以使用 javascript 风格 通过使用 Oriento DB 对象来使用事务。假设您使用的是 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 tests. Another good example can be found at Oriento's example folder.
我正在尝试在水线中创建事务,但我从 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);
});
}
我也在orientdb中直接检查了BEGIN
命令,但同样的错误。
目前的问题是混合了几个不同的概念,我将尝试一一解决:
水线的API本身不支持交易(勾选issue #755);
看起来您正在使用
sails-orientdb
适配器,并且您正在从中执行 raw SQL 查询;您在示例的第二行中执行的 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 docs。
或者,您可以使用 javascript 风格 通过使用 Oriento DB 对象来使用事务。假设您使用的是
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 tests. Another good example can be found at Oriento's example folder.