2014-12-04 131 views
2

我想在Sails 0.10.5中使用Postgres作爲數據庫實現一個事務,但是操作在最後沒有被提交(或回滾)。Sails.js + Postgres:與交易問題

這是一個簡單的交易場景我寫下的測試(使用async.js):

testTransaction: function(uri) { 

    var testFile = { 
     uri: uri, 
     details: { 'firstDetail': 'value' } 
    }; 

    async.auto({ 
     begin_transaction: function(callback) { 
      DataFile.query('BEGIN TRANSACTION;', callback); 
     }, 
     new_data_file: ['begin_transaction', function(callback) { 
      DataFile.create(testFile).exec(callback); 
     }], 
    }, function(error, results) { 
     if (error) { 
      console.log(error.message); 
      DataFile.query('ROLLBACK;', function(e, r) { 
       return error.message; 
      }); 
      return; 
     } 
     DataFile.query('COMMIT;', function(e, r) { 
      console.log("Saved file: " + results.new_data_file); 
      if (e) { 
       return "Error during commit"; 
      } 
      return results.new_data_file; 
     }); 
    }); 

} 

然後我運行該服務沒有錯誤;但是沒有新的DataFile enetity被添加到Postgres表中。如果我檢查Postgres的日誌,我找出:

2014-12-04 10:35:01 GMT 7984 548038d0.1f30LOG: statement: BEGIN TRANSACTION; 
2014-12-04 10:35:01 GMT 7977 548038d0.1f29LOG: execute <unnamed>: INSERT INTO "data_file" ("uri", "details", "created_at", "updated_at") values ($1, $2, $3, $4) RETURNING * 
2014-12-04 10:35:01 GMT 7977 548038d0.1f29DETAIL: parameters: $1 = '/just/another/test/uri', $2 = '{"firstDetail":"value"}', $3 = '2014-12-04 10:35:01+00', $4 = '2014-12-04 10:35:01+00' 
2014-12-04 10:35:01 GMT 7983 548038d0.1f2fLOG: statement: COMMIT; 
2014-12-04 10:35:01 GMT 7983 548038d0.1f2fWARNING: there is no transaction in progress 

所以我得到警告:「沒有交易正在進行」 在日誌中的第三個元素是Process ID。 顯然,COMMIT語句是由一個不同的進程(7983)發佈的,而不是發佈BEGIN(7984)的。這可能是問題嗎?如何在處理Sails交易時強制使用相同的流程?

回答

0

交易依賴於使用相同連接進行的多個查詢,但Waterline爲每個查詢使用不同的連接,這就是爲什麼您會收到「沒有正在處理的事務」消息 - 第二個查詢正在使用不同的連接,它沒有正在進行的事務。

除了將poolSize設置爲1(因此每個查詢都必須使用相同的連接)之外,沒有辦法解決此問題。

下面是我們用於交易的圖書館 - https://github.com/Shyp/pg-transactions。您將無法訪問輔助方法 - .find(),.update()等,但至少有可能。