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 に答える