什么合适的锁定技术来防止数据插入? [PostgreSQL的]

时间:2017-02-21 04:31:11

标签: postgresql

我想确保一个工作人员完全一个经理

CREATE TABLE IF NOT EXISTS user_relationships (
  object_id  SERIAL PRIMARY KEY               NOT NULL UNIQUE,
  manager_id INT REFERENCES users (object_id) NOT NULL,
  worker_id  INT REFERENCES users (object_id) NOT NULL,
  CHECK (manager_id != worker_id),
  UNIQUE (manager_id, worker_id)
);

我有一系列使用Read Committed级别的事务隔离的SQL语句,

BEGIN
SELECT * FROM users WHERE id=manager_id AND acc_type="manager" FOR UPDATE;
SELECT * FROM users WHERE id=worker_id AND acc_type="worker" FOR UPDATE;
SELECT * FROM relationships WHERE id=worker;
INSERT INTO relationships (m, w) VALUES (manager_id, worker_id)
COMMIT
  • 我已经想出了前两个 FOR UPDATE 以防止其他问题 通过更改用户帐户类型mid的并发事务 交易
  • 我无法弄清楚用于第三次查询的“技巧”。第三个查询应返回空列表,以确保该工作者尚未被任何经理拥有。
  • 第三次查询 FOR UPDATE 不起作用,因为我期待一个空行。
  • 由于第三次查询,我冒着并发事务的风险,将重复的工作人员添加到不同的经理。

如何将一名工人强制执行一名经理?

1 个答案:

答案 0 :(得分:2)

可能你需要将UNIQUE添加到对worker_id的约束:

CREATE TABLE IF NOT EXISTS user_relationships (
  object_id  SERIAL PRIMARY KEY               NOT NULL UNIQUE,
  manager_id INT REFERENCES users (object_id) NOT NULL,
  worker_id  INT REFERENCES users (object_id) UNIQUE NOT NULL,
  CHECK (manager_id != worker_id)
);

但最好将字段manager_id INT REFERENCES users (object_id) NOT NULL添加到表格users,不要使用user_relationships