当前位置: 首页 > 知识库问答 >
问题:

“选择更新”何时锁定解锁?

叶晋
2023-03-14

这是我的伪代码:

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

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

commit

我想问,如果条件等于“key”的行已经被删除,那么“select for update”阻止的锁是否可以自动解锁,这意味着如果另一个进程在此点进入并选择相同的“key”,它就不能被此进程阻止?

共有1个答案

公冶阳德
2023-03-14

在命令执行期间(通常是在命令开始时或接近命令开始时)执行锁。只有在事务提交或回滚时,才会释放锁(咨询锁除外)。没有<code>用于解锁,也没有<code>UNLOCK

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

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

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

我建议你发布一个新问题,对你试图解决的潜在问题进行更详细的描述。您假设问题的解决方案是“查找该行是否已被删除”或“解锁该行”。这可能不是真正的解决方案。这有点像有人说“我在哪里买汽油?”当他们的推式自行车不走了,所以他们认为它没有油了。燃料不是问题,问题是推式自行车不需要燃料,你必须踩下它们。

说明背景。解释你想要达到的目标。最重要的是,不要张贴伪代码,张贴您遇到问题的实际代码,最好是以自包含和可运行的形式。

 类似资料:
  • 我们的应用程序主要使用Hibernate版本支持的乐观锁定。我们计划在一个特定场景中实现悲观锁定。我没有太多悲观锁定的经验,所以如果这个问题听起来很幼稚,请原谅。 当用户显示更新条目的意图时——我们使用“选择更新”锁定相应的数据库行。现在,如果该用户花了很长时间提交他的更改,但在锁定后忘记了它,我们如何使用一些超时/回滚机制解锁此锁?这样该行就不会长时间保持锁定,并禁止所有其他用户对其进行编辑。

  • 问题内容: 我需要编写一个过程,该过程将允许我选择x数量的行,并同时更新这些行,以便调用应用程序将知道这些记录已锁定并正在使用。我在表中有一个名为“锁定”的列。下次调用该过程时,它将仅提取下一个x数量未选中“锁定”列的记录。我已经阅读了一些有关SQL Server的OUTPUT方法的信息,但是不确定这是我想要做的。 问题答案: 使用OUTPUT投票表决Cade Roux的答案: 之前: 这是我可以

  • 我有一个表和几个线程(系统),它们从表中读取特定列并更新它。因此,我的问题如下: 我想确保在任何时候只有一个线程可以选择和更新该列。最好的解决方案是什么? PS:据我所知,在SQL Server中使用事务会锁定事务中的所有资源,但我对PostgreSQL一无所知。 非常感谢。

  • 问题内容: 我创建了以下示例,以便您可以确切了解正在发生的事情:http : //jsfiddle.net/8t2Ln/101/ 如果我使用ng-options,也会发生同样的事情。我这样做有不同的原因,但由于简化了示例,所以省略了这一部分。 如您所见,默认情况下它具有两个选项。我将在选择旁边显示ng- model的选择值,以便您可以看到它的含义。当您在顶部添加第三个选项时,它会将值设置为该新选项

  • 问题内容: 我有一个可以支持一定数量的并发操作的应用程序。这由postgres中的“插槽”表表示。当节点联机时,它们会在表中插入许多行,每个插槽一个。当作业声明插槽时,它们会更新表中声明其中一个插槽的行,并在完成时再次释放它。 插槽表如下所示: 在任何时候,它都有一些固定的行数,每行可以或可以不填写job_name。 当新作业要启动时,它将运行以下查询以获取应在其上运行的节点的名称: (从游标中读

  • 我在用房间数据库。