gpt4 book ai didi

postgresql - 可以 SELECT ... NOWAIT "deadlock"吗?

转载 作者:行者123 更新时间:2023-11-29 11:34:45 25 4
gpt4 key购买 nike

文档说(强调我的):

FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE and FOR KEY SHARE are locking clauses; they affect how SELECT locks rows as they are obtained from the table.

With NOWAIT, the statement reports an error, rather than waiting, if a selected row cannot be locked immediately.

据此,我不确定以下行为是否可能。

想象一下从并发连接 S1 和 S2 运行相同的 SELECT ... NOWAIT 语句,它返回行 R1 和 R2。

  1. S1获取并锁定R1。
  2. S2获取并锁定R2。
  3. S1 试图获取 R2,但被 S2 锁定。
  4. S2 试图获取 R1,但被 S1 锁定。
  5. 由于 S1 失败,R1 上的锁被释放。

问题是第 4 步是否真的可以在第 3 步和第 5 步之间发生,或者第 3 步和第 5 步相对于并发选择以原子方式执行。

我猜这不可能发生,因为没有 NOWAIT(或 SKIP LOCKED),这种行为会导致死锁(S1 等待 S2 完成并释放 R2而 S2 等待 S1 完成并释放 R1),但也许这种情况会以其他方式解决。

那么,这里有哪些保证?

最佳答案

在您的场景中,如果它尝试使用 NOWAIT 选项获取 R2,则第 3 步应该会失败。当失败时,立即释放 S1 的所有锁,并且必须回滚 S1。这样,S2可能在第4步得到R1。这种情况不会死锁。

如果您尝试在第 3 步中获取 R2 而没有 NOWAIT 选项,则第 4 步将因检测到死锁而失败,并且 S2 将立即释放其所有锁。

保证是关系数据库中锁的定义行为,如 documentation 中所述。 :

To prevent the operation from waiting for other transactions to commit, use the NOWAIT option. With NOWAIT, the statement reports an error, rather than waiting, if a selected row cannot be locked immediately.

报告错误 意味着事务中断,必须回滚。事务是原子的。简而言之,这意味着如果它包含的所有步骤都已成功完成,则它只能通过提交终止。

关于postgresql - 可以 SELECT ... NOWAIT "deadlock"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57570606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com