1

我非常了解当使用 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 可以用作(滥用)线程同步机制吗?

4

1 回答 1

4

您正在混合图层。PostgreSQL 不做 HTTP。SELECT ... FOR UPDATE与HTTP无关。

以下是它的工作原理:

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

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

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

于 2015-04-21T09:50:14.880 回答