Sql 事务如何处理节点postgres?

Sql 事务如何处理节点postgres?,sql,node.js,postgresql,sqltransaction,node-postgres,Sql,Node.js,Postgresql,Sqltransaction,Node Postgres,我使用节点postgres以回调方式进行SQL查询。我有一个函数,它接收查询列表并在事务块中执行它们。我的理解是,我使用节点postgres提交查询“BEGIN”,提交事务块中需要的所有查询,然后提交查询“COMMIT” 然而,尽管我的查询是有效的(简单的插入,作为独立查询进行了很好的测试),并且所有操作都以正确的顺序执行,但当我在事务块之后测试数据库的状态时,我得到的是不一致的状态。有时我所有的插入都发生了,有时只有部分插入发生了。我的理解是,事务块是原子的,因此在提交后立即使用SELECT查

我使用节点postgres以回调方式进行SQL查询。我有一个函数,它接收查询列表并在事务块中执行它们。我的理解是,我使用节点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);
        }
    });
};

有什么想法吗?

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

pg.connect是否保证在每次通话时返回相同的连接?考虑在服务器上启用语句日志记录(包括在服务器LogiLynEngl前缀中包含连接和会话ID之类的东西),我不能保证返回相同的连接;事实上,我几乎肯定会得到不同的联系。然而,由于我的回调结构,这不应该是一个问题。我在“开始”之后回调,然后在事务中的(异步)查询之后回调,然后在“提交”之后回调。不管不同的查询是否使用不同的连接,它都应该以正确的顺序执行,这就是最重要的,对吗?或者组成事务块的查询必须在同一个连接上执行吗?你能解释一下不同的连接意味着什么,或者给我提供一个链接吗?但是你反复调用tryQuery,每次它都会调用
pg.connect
来执行查询,不是吗?或者,如果this.conn已连接,它是否会跳过连接?是的,事务块中的命令必须在同一连接上执行。