【问题标题】:Sails.js + Postgres: issue with transactionsSails.js + Postgres:交易问题
【发布时间】:2014-12-04 10:45:39
【问题描述】:

我正在尝试使用 Postgres 作为数据库在 Sails 0.10.5 中实现事务,但操作最终没有提交(或回滚)。

这是我写下来作为测试的一个简单事务场景(使用 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 实体被添加到 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

所以我收到警告:“没有正在进行的交易” 日志中的第三个元素是进程 ID。 显然,COMMIT 语句是由与发出 BEGIN (7984) 的进程不同的进程 (7983) 发出的。这可能是问题吗?在 Sails 中处理事务时,如何强制使用相同的流程?

【问题讨论】:

    标签: postgresql transactions sails.js


    【解决方案1】:

    事务依赖于使用相同连接进行的多个查询,但 Waterline 对每个查询使用不同的连接,这就是您收到“没有正在进行的事务”消息的原因 - 第二个查询使用不同的连接,它没有正在进行的事务。

    除了将 poolSize 设置为 1(因此每个查询都必须使用相同的连接)之外,没有其他方法可以解决此问题。

    这是我们用于交易的库 - https://github.com/Shyp/pg-transactions。您将无法访问辅助方法 - .find().update() 等,但至少有可能。

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      • 2015-02-06
      • 2012-01-23
      • 2023-03-29
      相关资源
      最近更新 更多