Multithreading 选择更新行为
我非常了解在使用SELECT FOR update并进行另一次SELECT/update时,行的更新会发生什么。但是,当使用SELECT FOR UPDATE发出两个请求时会发生什么情况呢 例如:Multithreading 选择更新行为,multithreading,postgresql,concurrency,thread-safety,select-for-update,Multithreading,Postgresql,Concurrency,Thread Safety,Select For Update,我非常了解在使用SELECT FOR update并进行另一次SELECT/update时,行的更新会发生什么。但是,当使用SELECT FOR UPDATE发出两个请求时会发生什么情况呢 例如: 线程A启动一个事务,对一行执行SELECT FOR UPDATE,检索一些信息,并开始一个需要时间的HTTP请求。调用返回后,事务被提交,会话被关闭 线程B在A等待请求时,启动一个新事务,并在同一行上选择更新。它将检索信息并在其上继续执行HTTP请求,还是等待线程A提交/执行更新,然后从行中检索数据
但是实际的HTTP请求会由他们两人完成吗?换句话说,在这种情况下,SELECT FOR UPDATE可以用作(滥用)线程同步机制吗?您正在混合层。PostgreSQL不做HTTP<代码>选择。。。FOR UPDATE与HTTP无关 下面是它的工作原理:
- 第1课时开始
- 第2课时开始了
- 会话1没有选择
。。。用于更新,并获取一行或多行
- 第2课时不选择
,并匹配同一行中的一行,因此它将阻塞,不返回任何内容,直到。。。对于更新
- 会话1执行
或提交
回滚
- 会话2从前面的
SELECT。。。用于更新
(而且,这与线程无关)。您正在混合层。PostgreSQL不做HTTP<代码>选择。。。FOR UPDATE与HTTP无关 下面是它的工作原理:
- 第1课时开始
- 第2课时开始了
- 会话1没有选择
。。。用于更新,并获取一行或多行
- 第2课时不选择
,并匹配同一行中的一行,因此它将阻塞,不返回任何内容,直到。。。对于更新
- 会话1执行
或提交
回滚
- 会话2从前面的
SELECT。。。用于更新
(此外,这与线程无关)。谢谢克雷格。是的,我知道线程和Http与PostgreSQL无关。也许我没有正确地表达自己。然而,我想你回答了我的问题。会话2阻止其执行,直到会话1完成提交后才继续。因此,在会话1提交更改之前,它不会前进到SELECT FOR UPDATE之后存在的HTTP调用。我说得对吗?@idipous正如我所说,我不可能回答这个问题,因为我不知道您使用的是什么框架,它如何管理事务,等等。这取决于应用程序何时提交。仅此而已。因此,您必须确定应用程序何时提交。根据您的编辑,这听起来像是事务在与客户端的整个HTTP交换过程中保持打开状态,在这种情况下,是的,它将阻止会话B继续,直到会话A返回。这完全取决于您何时提交。我编辑了我的问题,以澄清事务开始和提交点。谢谢Craig。是的,我知道线程和Http与PostgreSQL无关。也许我没有正确地表达自己。然而,我想你回答了我的问题。会话2阻止其执行,直到会话1完成提交后才继续。因此,在会话1提交更改之前,它不会前进到SELECT FOR UPDATE之后存在的HTTP调用。我说得对吗?@idipous正如我所说,我不可能回答这个问题,因为我不知道您使用的是什么框架,它如何管理事务,等等。这取决于应用程序何时提交。仅此而已。因此,您必须确定应用程序何时提交。根据您的编辑,这听起来像是事务在与客户端的整个HTTP交换过程中保持打开状态,在这种情况下,是的,它将阻止会话B继续,直到会话A返回。这完全取决于您提交的时间。我编辑了我的问题以清除事务开始和提交点。