gpt4 book ai didi

multithreading - 选择更新行为

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

我很清楚当使用 SELECT FOR UPDATE 并且发生另一个 SELECT/UPDATE 时,行的更新会发生什么。但是当使用 SELECT FOR UPDATE 发生两个请求时会发生什么。

例如:

  1. 线程 A 开始一个事务并对一行执行 SELECT FOR UPDATE 并检索一些信息并开始一个需要时间的 HTTP 请求。调用返回后提交事务并关闭 session
  2. 线程 B,当 A 等待请求时,开始一个新事务并在同一行上执行 SELECT FOR UPDATE。它会检索信息并在其打开时继续 HTTP 请求,还是会等待线程 A 提交/执行更新,然后从行中检索数据。

我不关心一旦请求返回并且更新表的时间到了会发生什么。用于更新的第二个将抛出或更新行中最后可能的数据。

但是实际的HTTP请求会由他们两个来完成吗?换句话说,在这种情况下,是否可以将 SELECT FOR UPDATE 用作(滥用)线程同步机制?

最佳答案

您正在混淆图层。 PostgreSQL 不支持 HTTP。 SELECT ... FOR UPDATE 与 HTTP 无关。

这是它的工作原理:

  • session 1 BEGIN
  • session 2 BEGIN
  • session 1 执行 SELECT ... FOR UPDATE 并获取一行或多行
  • session 2 执行 SELECT ... FOR UPDATE 并匹配同一行之一,因此它阻塞,不返回任何内容,直到...
  • session 1 执行 COMMITROLLBACK
  • session 2 从早期的 SELECT ... FOR UPDATE
  • 获取结果

换句话说,锁定时间由事务边界控制。事务边界所在的位置取决于您的应用程序和框架,以及您尚未以任何方式确定的数据库层之上的内容。

(此外,这与线程无关)。

关于multithreading - 选择更新行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29767148/

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