Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 选择更新行为_Multithreading_Postgresql_Concurrency_Thread Safety_Select For Update - Fatal编程技术网

Multithreading 选择更新行为

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提交/执行更新,然后从行中检索数据

我非常了解在使用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返回。这完全取决于您提交的时间。我编辑了我的问题以清除事务开始和提交点。