4

我正在使用 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);
        }
    });
};

对出了什么问题有任何想法吗?

4

1 回答 1

3

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

于 2012-12-06T15:54:19.337 回答