postgresql - 当启用事务池并发出单个语句时,pgbouncer 如何表现?

标签 postgresql transactions pgbouncer

我在 Web 应用程序上使用 pgbouncer,大多数线程以 BEGIN 开头,以 COMMIT 或 ROLLBACK 结束,因此我们使用事务池,一切都很好。

但是,我们也有一些进程不使用事务:相反,它们只是一个接一个地发出命令。

我相信,在事务池下,每个命令本身都是一个事务,就像直接连接到服务器时的情况一样,也许每个命令都从池中获取不同的连接。但我被告知 pgbouncer 不会这样做,而是永远不会找到最终的 COMMIT/ROLLBACK,因此连接不会返回到池中。

有人知道会发生什么吗?我在文档中找不到任何内容。

最佳答案

https://pgbouncer.github.io/usage.html

https://pgbouncer.github.io/config.html#description

Transaction pooling

A server connection is assigned to client only during a transaction. When PgBouncer notices that transaction is over, the server connection will be put back into the pool.

在您的情况下,如果事务永远不会结束(提交、回滚),它将达到idle_transaction_timeout(默认禁用),并且空闲事务连接将返回池,允许其他人连接。如果你有它的默认值,在某些时候所有连接池都会被填满,所以新的连接池将被拒绝。从此时起,您的单个语句将不起作用 - 它们将等待永远不会出现的免费连接。

关于单个语句 - 它们不是“通过 pgbounce 转换为事务”,也不是“在事务池中,每个命令本身就是一个事务”。这是由每个 session 的 AUTOCOMMIT 控制的。

关于postgresql - 当启用事务池并发出单个语句时,pgbouncer 如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394272/

相关文章:

sql-server - 是否可以将参照完整性检查推迟到 SQL Server 中的事务结束?

ruby-on-rails - 在 Rails 中禁用连接池以使用 PgBouncer

java - 为什么 PostgreSQL JDBC 驱动程序在身份验证期间向服务器发送错误的数据包 header ?

sql - PostgreSQL 许多 jsonb 列与许多行

sql - PostgreSQL 不接受 WHERE 子句中的列别名

sql - 从 tsvector 中检索词素出现的位置和数量

database - 数据库事务计划

postgresql - 如何在 Postgresql 中水平组契约(Contract)一个表上的两个选择查询?

sql - SQL 中的事务和回滚

java - Postgres-错误 : prepared statement "S_1" already exists