如何使用 pg-promise 锁定 table
How to lock table with pg-promise
我有
db.result('DELETE FROM categories WHERE id = ${id}', category).then(function (data) { ...
和
db.many('SELECT * FROM categories').then(function (data) { ...
最初删除是从一个 API 调用中调用的,然后 select 在随后的 API 调用中调用,但是数据库请求的回调以相反的顺序发生,所以我得到了类别列表已删除类别。
有没有办法用 pg-promise 锁定类别 table?
如果您希望 SELECT
的结果始终反映前一个 DELETE
的结果,那么您可以考虑两种方法...
标准方法是将操作统一为一个,因此您最终会针对同一连接执行所有相关查询:
db.task(function * (t) {
yield t.none('DELETE FROM categories WHERE id = ${id}', category);
return yield t.any('SELECT FROM categories');
})
.then(data => {
// data = only the categories that weren't deleted
});
当然,您也可以使用标准的 promise 语法甚至 ES7 await/async
。
第二种方法是在您的服务中组织一个人工锁,在 DELETE
请求全部完成之前推迟执行任何相应的 SELECT
。
然而,这是一个非常尴尬的解决方案,通常指向架构中的缺陷。另外,作为 pg-promise 的作者,我什至不会涉及该解决方案,因为它无论如何都在我的图书馆之外。
我有
db.result('DELETE FROM categories WHERE id = ${id}', category).then(function (data) { ...
和
db.many('SELECT * FROM categories').then(function (data) { ...
最初删除是从一个 API 调用中调用的,然后 select 在随后的 API 调用中调用,但是数据库请求的回调以相反的顺序发生,所以我得到了类别列表已删除类别。
有没有办法用 pg-promise 锁定类别 table?
如果您希望 SELECT
的结果始终反映前一个 DELETE
的结果,那么您可以考虑两种方法...
标准方法是将操作统一为一个,因此您最终会针对同一连接执行所有相关查询:
db.task(function * (t) {
yield t.none('DELETE FROM categories WHERE id = ${id}', category);
return yield t.any('SELECT FROM categories');
})
.then(data => {
// data = only the categories that weren't deleted
});
当然,您也可以使用标准的 promise 语法甚至 ES7 await/async
。
第二种方法是在您的服务中组织一个人工锁,在 DELETE
请求全部完成之前推迟执行任何相应的 SELECT
。
然而,这是一个非常尴尬的解决方案,通常指向架构中的缺陷。另外,作为 pg-promise 的作者,我什至不会涉及该解决方案,因为它无论如何都在我的图书馆之外。