有必要加锁table吗?

Is it nessesary to lock table?

我有 users table 和 tasks table 以及 user_id 列。要求用户在 active 状态下只能有一项任务。

基本上用户在tododone状态下可以有很多任务,但在active状态下只能有一个任务。

问题是如何更新任务状态以只为用户保留一项活动任务。 (可能的情况是不同的任务和分配给任务的同一用户会有 2 个同时更新操作) 我的想法是:

  1. 开始交易
  2. 更新和插入的锁定任务table
  3. 检查用户是否有活动任务
  4. 如果不更新任务状态
  5. 解锁table
  6. 提交交易

这是正确的做法吗?

锁定的更好选择是定义条件唯一索引。

当 status=Active

时,您在用户 ID 上创建索引条目
create index idx_userid on users(user_id)
where status='Active

这是一个简单的例子

https://dbfiddle.uk/?rdbms=postgres_10&fiddle=0df9c557f4e8ef659f02172b367d0ada