选择更新行为

idi*_*ous 2 postgresql concurrency multithreading thread-safety select-for-update

我很好地理解当使用 SELECT FOR UPDATE 并发生另一个 SELECT/UPDATE 时,行的更新会发生什么。但是,当使用 SELECT FOR UPDATE 发出两个请求时会发生什么。

例如:

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

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

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

Cra*_*ger 5

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

它的工作原理如下:

  • 第 1 节确实BEGIN
  • 第 2 节确实BEGIN
  • 会话 1 执行SELECT ... FOR UPDATE并获取一行或多行
  • 会话 2 执行SELECT ... FOR UPDATE并匹配相同的行之一,因此它会阻塞,不返回任何内容,直到...
  • 会话 1 执行COMMITROLLBACK
  • 会话 2 获取之前的结果SELECT ... FOR UPDATE

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

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