Database “什么时候?”;选择“更新”选项;锁定和解锁?

Database “什么时候?”;选择“更新”选项;锁定和解锁?,database,postgresql,locking,Database,Postgresql,Locking,这是我的伪代码: 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”,它就不能被这

这是我的伪代码:

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”,它就不能被这个进程阻止

锁是在命令执行期间(通常是在或接近开始时)执行的。锁(除外)仅在事务提交或回滚时释放。没有用于解锁的
,也没有用于逆转表级
锁定
命令效果的
解锁
命令。这些都解释清楚了

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

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

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

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

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