Select 用于更新行为
Select for Update behavior
我很清楚当使用 SELECT FOR UPDATE 并且另一个 SELECT/UPDATE 发生时,行的更新会发生什么。但是当两个请求发生 SELECT FOR UPDATE.
时会发生什么
例如:
- 线程 A 启动事务 并在行上执行 SELECT FOR UPDATE 并检索一些信息并开始 HTTP 请求,这需要时间。调用返回后提交事务并关闭会话。
- 线程 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
COMMIT
或 ROLLBACK
- 第 2 节获取早期
SELECT ... FOR UPDATE
的结果
换句话说,锁定时间由事务边界控制。事务边界所在的位置取决于您的应用程序和框架,以及您尚未以任何方式识别的数据库层之上的内容。
(另外,这与线程无关)
我很清楚当使用 SELECT FOR UPDATE 并且另一个 SELECT/UPDATE 发生时,行的更新会发生什么。但是当两个请求发生 SELECT FOR UPDATE.
时会发生什么例如:
- 线程 A 启动事务 并在行上执行 SELECT FOR UPDATE 并检索一些信息并开始 HTTP 请求,这需要时间。调用返回后提交事务并关闭会话。
- 线程 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
COMMIT
或ROLLBACK
- 第 2 节获取早期
SELECT ... FOR UPDATE
的结果
换句话说,锁定时间由事务边界控制。事务边界所在的位置取决于您的应用程序和框架,以及您尚未以任何方式识别的数据库层之上的内容。
(另外,这与线程无关)