使用node.js,postgresql和knex.js时竞争

时间:2014-09-10 22:49:41

标签: database node.js postgresql race-condition knex.js

我有一个node.js + express 4 + socket.io + postgresql(带有knex.js)应用程序。其目的是通过socket.io将任务发送到连接的客户端进行处理。这就是我实现查询以获取计算新任务的方法:

update data
  set status='computing'
  where id = (select id from data where status = 'new' limit 1)
  returning *

我使用updatereturning选项来确保获取任务的操作是原子的。问题是,当有多个客户端时,他们无论如何都可以多次请求任务。

仅当使用knex.js库构建查询时才会发生这种情况。我怀疑是什么原因,knex.js保持连接池打开。在调试时,似乎我的应用程序在结果解析的任何promise之前多次执行查询的方法(然后对于其中许多是相同的)。连接了约20个客户端,多达8个可以在我的应用程序中获得相同的任务。

一开始我使用pg-query模块,每次调用时都会创建一个db连接,一切正常。

编辑:我现在发现第二种方法也有比赛。只是它们的发生频率要低得多。

那么:我做错了什么?如何改进我的代码/数据库以使其更好。

1 个答案:

答案 0 :(得分:0)

当我在另一个问题中找到答案时,不同的问题我会在这里发布。供将来参考:Atomic UPDATE .. SELECT in Postgres