有必要加锁table吗?
Is it nessesary to lock table?
我有 users
table 和 tasks
table 以及 user_id
列。要求用户在 active
状态下只能有一项任务。
基本上用户在todo
、done
状态下可以有很多任务,但在active
状态下只能有一个任务。
问题是如何更新任务状态以只为用户保留一项活动任务。 (可能的情况是不同的任务和分配给任务的同一用户会有 2 个同时更新操作)
我的想法是:
- 开始交易
- 更新和插入的锁定任务table
- 检查用户是否有活动任务
- 如果不更新任务状态
- 解锁table
- 提交交易
这是正确的做法吗?
锁定的更好选择是定义条件唯一索引。
当 status=Active
时,您在用户 ID 上创建索引条目
create index idx_userid on users(user_id)
where status='Active
这是一个简单的例子
https://dbfiddle.uk/?rdbms=postgres_10&fiddle=0df9c557f4e8ef659f02172b367d0ada
我有 users
table 和 tasks
table 以及 user_id
列。要求用户在 active
状态下只能有一项任务。
基本上用户在todo
、done
状态下可以有很多任务,但在active
状态下只能有一个任务。
问题是如何更新任务状态以只为用户保留一项活动任务。 (可能的情况是不同的任务和分配给任务的同一用户会有 2 个同时更新操作) 我的想法是:
- 开始交易
- 更新和插入的锁定任务table
- 检查用户是否有活动任务
- 如果不更新任务状态
- 解锁table
- 提交交易
这是正确的做法吗?
锁定的更好选择是定义条件唯一索引。
当 status=Active
时,您在用户 ID 上创建索引条目create index idx_userid on users(user_id)
where status='Active
这是一个简单的例子
https://dbfiddle.uk/?rdbms=postgres_10&fiddle=0df9c557f4e8ef659f02172b367d0ada