【问题标题】:How does PostgreSQL handle temp table ON COMMIT DROP in the face of multiple threads?PostgreSQL 面对多线程如何处理临时表 ON COMMIT DROP?
【发布时间】:2017-10-18 20:35:03
【问题描述】:

the documentation:

ON COMMIT DROP:临时表将在当前事务块结束时被删除。

但是,临时表是唯一的每个会话,而不是每个线程see here

我的问题:

如果一个临时表被标记为 WITH ON COMMIT DROP,那么 PG 将如何处理多个线程访问该表的事实,即任何线程都可以提交,但由于其他线程正在使用该表而无法删除该表。

编辑: AFAIK,多个事务可以在一个会话中运行。如果是这种情况,多个事务可以访问具有临时表的函数,因此我的问题。

【问题讨论】:

  • 线程是否共享相同的连接/会话?
  • 这有点超出我的范围,但从我读到的内容来看,如果使用连接池,那么多个“线程”将共享同一个连接并且可能是会话。
  • 不要通过加入连接池来使事情复杂化。 (或:改写问题)
  • AFAIK,一个会话可以运行多个事务。将池放在一边。
  • 也有可能我误解了我阅读的链接中的数据,而“线程”只是指从事务中的任何点进行的函数调用。如果是这样,我的问题得到了回答。

标签: multithreading postgresql concurrency transactions postgresql-10


【解决方案1】:

Postgres(服务器)对客户端线程一无所知。它将会话视为分组在事务中的一系列连续命令。从服务器的角度来看,会话内的并发是不可能的。

客户端应用程序可能是多线程的,并且线程可以使用相同的连接。应用程序开发人员负责确保线程不会相互竞争以访问服务器资源。 From the documentation:

一个线程限制是没有两个线程试图同时操作同一个 PGconn 对象。特别是,您不能通过同一个连接对象从不同线程发出并发命令。 (如果您需要运行并发命令,请使用多个连接。)

【讨论】:

  • 这是有道理的。我没有得到的是 Erwin Brandstetter 在此链接中的回答:stackoverflow.com/questions/10596896/…。为什么要麻烦为“线程”分配唯一 ID?
  • 据我了解,这是对客户端多线程特殊情况的描述。 Erwin 写了多线程共享表的一种可能方式。
  • 所以底线是,在服务器上,没有任何奇怪的客户端线程(违反规则),没有必要关心,对吧?
  • 没错。应用程序开发人员必须在多线程环境中使用他们的方法,以便服务器看到一个线性会话。
猜你喜欢
  • 2022-09-23
  • 2021-11-06
  • 1970-01-01
  • 2018-02-14
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2010-10-03
相关资源
最近更新 更多