事务如何与node-postgres一起使用?

时间:2012-12-04 16:57:25

标签: sql node.js postgresql sqltransaction node-postgres

我正在使用node-postgres来使用回调样式进行SQL查询。我有一个函数,它接受一个查询列表并在事务块中执行它们。我的理解是我使用node-postgres提交查询“BEGIN”,在我的事务块中提交我需要的所有查询,然后提交查询“COMMIT”。

然而,事件虽然我的查询是有效的(简单插入,经过充分测试,作为独立查询),并且一切都肯定以正确的顺序执行,当我在事务块之后测试数据库的状态时,我我的状态不一致。有时我的所有插入都会发生,有时只有一些插件发生。我的理解是事务块是原子的,因此在提交后立即使用SELECT查找块中的插入应该是全部或全部。

这是我的功能:

Db.prototype.makeTransaction = function (queries, callback) {
    var thisDb = this;
    thisDb.tryQuery("BEGIN", [], function () {
        async.forEach(queries, function (query, arrayCallback) {
            thisDb.tryQuery(query.sql, query.values, arrayCallback);
        }, function (err) {
            if (err) {
                thisDb.tryQuery("ROLLBACK", [], function () {
                    callback(err);
                });
            } else {
                thisDb.tryQuery("COMMIT", [], callback);
            }
        });
    });
};

使用辅助函数tryQuery:

Db.prototype.tryQuery = function (query, values, callback) {
    pg.connect(this.conn, function (err, client) {
        if (!err) {
            client.query(query, values, callback);
        } else {
            // Failed to connect to the database
            callback(err);
        }
    });
};

关于出了什么问题的任何想法?

1 个答案:

答案 0 :(得分:3)

感谢araqnid回答我的问题:交易必须在同一个连接上完成。