【发布时间】:2015-06-28 07:34:23
【问题描述】:
我非常了解当使用 SELECT FOR UPDATE 并发生另一个 SELECT/UPDATE 时更新一行会发生什么。但是当使用 SELECT FOR UPDATE 发生两个请求时会发生什么。
例如:
- 线程 A 启动一个事务并在一行上执行 SELECT FOR UPDATE 并检索一些信息并开始一个需要时间的 HTTP 请求。调用返回后事务提交并关闭会话。
- 线程 B,当 A 等待请求时,启动一个新事务并在同一行上执行 SELECT FOR UPDATE。它会检索信息并继续执行 HTTP 请求,还是会等待线程 A 提交/执行更新,然后从行中检索数据。
我不在乎一旦请求返回和更新表的时间到来时会发生什么。用于更新的第二个将抛出或更新行上最后可能的数据。
但是实际的 HTTP 请求会由他们俩完成吗?换句话说,在这种情况下 SELECT FOR UPDATE 可以用作(滥用)线程同步机制吗?
【问题讨论】:
标签: multithreading postgresql concurrency thread-safety select-for-update