【发布时间】:2018-10-05 19:40:43
【问题描述】:
我想实现的任务分配 em>的系统。用户可以从池中请求任务。即使设置为序列,交易有时会给出相同的任务给多个用户,即使它不应该。 P>
在工作表中充满了许多行,让我们说每个人都有 与 我们有大约100个活跃用户reqularly请求的任务。该作品如预期,在1000个请求可能除了一次。
然后,两个 我们使用的Postgres 10.3和该查询从Scala代码经由油滑3.2.3 Postgres的日志显示请求被在不同的会话中运行,并且 我试图重写在不同风格的查询,inculding 感谢任何帮助。 我要补充一点,有时预期的序列错误/回滚的不 em>的出现,在我们的应用程序重试查询。我看到这个正确的行为中的最后一个小时日志10倍,但2次它仍然错误地分配相同的任务两次,如上所述。 P>
简化架构: H3>
CREATE TABLE tasks(
_id CHAR(24) PRIMARY KEY,
totalInstances BIGINT NOT NULL
);
CREATE TABLE assigned(
_id CHAR(24) PRIMARY KEY,
_task CHAR(24) NOT NULL
);
totalInstances = 1,这意味着每个任务应该最多分配一次。 P>
查询中添加一行
assigned: H3>
WITH task_instances AS (
SELECT t._id, t.totalInstances - COUNT(assigned._id) openInstances
FROM tasks t
LEFT JOIN assigned ON t._id = assigned._task
GROUP BY t._id, t.totalInstances
),
selected_task AS (
SELECT _id
FROM task_instances
WHERE openInstances > 0
LIMIT 1
)
INSERT INTO assigned(_id, _task)
SELECT $1, _id
FROM selected_task;
$1被传递到每个查询的随机ID。 P>
症状 H3>
assigned为相同 EM> _task时并行请求ID创建的行。我期望可序列化的执行回滚第二个,由于openInstances本来应该通过的第一个下降到0。 P>
设置
withTransactionIsolation(Serializable)运行。没有其他查询从删除或插入assigned表。 P>
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;是每个任务分配查询之前执行。 P>
VIEW S的使用量为WITH子查询,以及围绕与BEGIN和COMMIT但没有效果。 P>的查询
编辑
【问题讨论】:
标签: sql postgresql concurrency transactions serializable