Select 用于更新行为

Select for Update behavior

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

时会发生什么

例如:

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

我不在乎一旦请求 returns 和更新 table 的时间到了会发生什么。用于更新的第二个将抛出或更新行中最后可能的数据。

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

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

工作原理如下:

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

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

(另外,这与线程无关)