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);
}
});
};
何がうまくいかないのかについて何か考えはありますか?