我正在使用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);
}
});
};
关于出了什么问题的任何想法?
答案 0 :(得分:3)
感谢araqnid回答我的问题:交易必须在同一个连接上完成。