小编fm0*_*fm0的帖子

Postgresql Serializable Transaction无法按预期工作

我正在尝试实现一个任务分配系统.用户可以从池中请求任务.即使设置为SERIALIZABLE,事务有时也会向多个用户提供相同的任务,即使它不应该.

简化架构:

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
);
Run Code Online (Sandbox Code Playgroud)

任务表中填充了许多行,假设每个行都有totalInstances = 1,这意味着每个任务最多应分配一次.

查询以添加行assigned:

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 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql concurrency transactions serializable

7
推荐指数
1
解决办法
535
查看次数