【问题标题】:When does "select for update" lock and unlock?“选择更新”何时锁定和解锁?
【发布时间】:2013-03-22 03:01:12
【问题描述】:

这是我的伪代码:

re = [select **result** from table where **condition**=key for update]

if[re satisfies]
{
    delete from table where **condition** = key;
}

commit

我想问一下条件等于“key”的行是否已经被删除了,是否可以自动解锁被“select for update”阻塞的锁,也就是说如果此时另一个进程进入并select for同样的“钥匙”不能被这一把挡住吗?

【问题讨论】:

    标签: database postgresql locking


    【解决方案1】:

    在命令执行期间(通常在或接近开始时)执行锁定。锁定(advisory locks 除外)在事务提交或回滚时释放。没有FOR UNLOCK,也没有UNLOCK 命令来反转表级LOCK 命令的效果。这都解释了in the concurrency control section of the PostgreSQL documentation

    您必须提交或回滚您的事务才能释放锁。

    此外,询问“此行是否已被另一个并发事务删除”实际上没有任何意义。在删除该行的事务提交之前,它并没有真正被删除......即使这样,它也可能已经删除并重新插入了该行,或者另一个并发事务可能已经再次插入了该行。

    您是否正在构建一个任务队列或消息队列系统,因为如果是这样,那么这个问题就解决了,您不应该尝试重新发明那个异常复杂的轮子。请参阅PGQActiveMQRabbitMQZeroMQ 等(未来的 PostgreSQL 版本may include FOR UPDATE SKIP LOCKED,因为它正在测试中,但在撰写本文时尚未发布)。

    我建议您发布一个新问题,更详细地描述您要解决的潜在问题。您假设问题的解决方案是“找出该行是否已被删除”或“解锁该行”。这可能不是真正的解决方案。这有点像有人说“我在哪里买汽油”当他们的推车不去时,他们认为它已经没油了。燃料不是问题,问题是手推车不耗油,你必须踩踏板。

    解释背景。解释你想要达到的目标。最重要的是,不要发布伪代码,发布您遇到问题的实际代码,最好以独立且可运行的形式发布。

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多