【问题标题】:Node Orm2 transaction plugin节点 Orm2 交易插件
【发布时间】:2014-01-01 08:15:14
【问题描述】:

我似乎对如何将事务插件(使用 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 事务插件中的文档进行操作。

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

【问题讨论】:

    标签: node.js postgresql transactions node-orm2


    【解决方案1】:

    这应该可行。

    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 确实返回错误,你可以简单地返回而不运行提交,并且链不会被提交。我尝试将它用于嵌套的创建语句,有一大堆相互依赖的语句。只要您不提交,就不会提交任何语句。谢谢你,文档有点不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2017-04-03
    • 2017-01-21
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多