【问题标题】:Is it nessesary to lock table?有必要锁表吗?
【发布时间】:2021-11-11 01:07:18
【问题描述】:

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

基本上用户可以在tododone 状态下执行许多任务,但在active 状态下只能执行一项任务。

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

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

是正确的方法吗?

【问题讨论】:

  • 你最好发布代码......
  • 你使用的是哪个数据库
  • @GeorgeJoseph,postgres

标签: sql postgresql transactions deadlock


【解决方案1】:

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

当 status=Active 时,您在用户 ID 上创建索引条目

create index idx_userid on users(user_id)
where status='Active

这是一个简单的例子

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

【讨论】:

  • 拥有约束将确保您的模型适合多用户场景
  • Sql Server 有类似的东西,虽然看起来没什么不同,但我不记得 MySql 支持这个——至少在部分索引方面(我可能错了)。另外,我添加了一些关于准备处理客户端代码中导致的 INSERT/UPDATE 失败的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2011-06-06
相关资源
最近更新 更多