Node.js 节点Orm2事务插件

Node.js 节点Orm2事务插件,node.js,postgresql,transactions,node-orm2,Node.js,Postgresql,Transactions,Node Orm2,我似乎对如何将事务插件(使用postgresql)与节点orm2一起使用存在问题。我想我误解了事务是如何处理异步函数调用的。下面是我的代码示例: function(row){ db.transaction(function(err, txn){ if(err){ return console.log(err) }; row.property = 'foo'; row.save(function(err){ if(err){ return c

我似乎对如何将事务插件(使用postgresql)与节点orm2一起使用存在问题。我想我误解了事务是如何处理异步函数调用的。下面是我的代码示例:

function(row){
  db.transaction(function(err, txn){
    if(err){ return console.log(err) };       
    row.property = 'foo';

    row.save(function(err){
      if(err){ return console.log(err) };
      console.log("saved");
    });

    txn.commit(function(err){
      if(err){ return console.log(err) };
      console.log("committed");
    });
  });
当我运行这段代码时,偶尔会看到console.log输出:

"committed"
"saved"
这与我的预期相反。我对行所做的更改不会保存到数据库中。这里的异步函数调用似乎存在一些问题,但我只是按照节点orm2事务插件的文档进行操作

有人知道我做错了什么吗?谢谢

这应该行得通

function(row){
  db.transaction(function(err, txn){
  if(err){ return console.log(err) };       
  row.property = 'foo';

  row.save(function(err){
    if(err){ return console.log(err) };
    console.log("saved");
    txn.commit(function(err){
      if(err){ return console.log(err) };
      console.log("committed");
    });
  });
});

这应该是可接受的答案,如果您在回调中提交事务,它将工作,并且如果row.save确实返回错误,您可以直接返回而不运行提交,并且不会提交链。我尝试了嵌套的create语句,有一大堆相互依赖的语句。只要您不提交,就不会提交任何语句。谢谢,文档有点不清楚。