选择更新行为

时间:2015-04-21 08:45:06

标签: multithreading postgresql concurrency thread-safety select-for-update

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

例如:

  1. 线程A 启动一个事务并在一行上执行SELECT FOR UPDATE并检索一些信息并开始需要时间的HTTP请求。呼叫返回后提交了事务并且会话已关闭
  2. 线程B,当A等待请求时,启动一个新事务并在同一行上执行SELECT FOR UPDATE。它是否会检索信息并继续执行HTTP请求,或者等待线程A提交/执行更新,然后从行中检索数据。
  3. 我不关心请求返回后会发生什么,更新表的时间到了。更新的第二个将抛出或更新行上的最后可能的数据。

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

1 个答案:

答案 0 :(得分: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
  • 的结果

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

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