我正在尝试实现一件非常简单的事情:
START TRANSACTION;
DELETE FROM table WHERE id = 1;
ROLLBACK;
在postgres
数据库上运行它可以完美地工作。对于massive.js
,它不会:
this.db.run(
"START TRANSACTION",
[]
);
setTimeout(() => {
this.db.run(
"DELETE FROM table WHERE id = $1"
[1]
);
}, 2000);
setTimeout(() => {
this.db.run(
"ROLLBACK;"
[]
);
}, 4000);
它不会回滚更改,只是从数据库中删除。COMMIT
不能很好地工作。怎么了?
有什么方法可以转储查询顺序吗?
发布于 2017-08-16 12:19:21
Massive在底层使用pg-promise,这反过来又支持事务:
db.instance.tx(t => {
// BEGIN has been executed
return t.none('DELETE FROM table WHERE id = $1', [123])
.then(() => {
// Records have been deleted within the transaction
throw new Error('Random error to fail the transaction');
// = the same as returning Promise.reject(new Error('Random...'))
});
})
.catch(error => {
// ROLLBACK has been executed, no records end up deleted.
console.log(error);
});
另请参阅:
有什么方法可以转储查询顺序吗?
Monitoring Queries向您展示了如何执行此操作,或者您可以在初始化db.driverConfig
时在massive
对象中添加事件query处理程序。
https://stackoverflow.com/questions/45571874
复制相似问题