Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Sql 交易范围和编制的报表_Sql_Postgresql - Fatal编程技术网

Sql 交易范围和编制的报表

Sql 交易范围和编制的报表,sql,postgresql,Sql,Postgresql,我想知道事务和准备好的语句是如何界定范围的。对于scoped,我的意思是它们是否绑定到创建它们的特定连接或环境 更具体地说: 准备好的语句是否可以在创建它的连接之外的连接上重用 如果准备好的语句是在事务外部创建的,那么它是否可以在事务内部使用,反之亦然 事务是否绑定到创建它的连接 当然只限于一个客户 准备好的语句是否可以在创建它的连接之外的连接上重用 不,它是特定于会话(连接)的 术语“会话”和“连接”在PostgreSQL中目前是可互换的,因为无法保存会话并在以后的连接中恢复会话 如果准备

我想知道事务和准备好的语句是如何界定范围的。对于scoped,我的意思是它们是否绑定到创建它们的特定连接或环境

更具体地说:

  • 准备好的语句是否可以在创建它的连接之外的连接上重用
  • 如果准备好的语句是在事务外部创建的,那么它是否可以在事务内部使用,反之亦然
  • 事务是否绑定到创建它的连接
当然只限于一个客户

准备好的语句是否可以在创建它的连接之外的连接上重用

不,它是特定于会话(连接)的

术语“会话”和“连接”在PostgreSQL中目前是可互换的,因为无法保存会话并在以后的连接中恢复会话

如果准备好的语句是在事务外部创建的,那么它是否可以在事务内部使用,反之亦然

对。准备好的语句是会话级的,而不是事务级的。对于事务级预处理语句,没有
PREPARE LOCAL
,就像事务局部变量的
SET LOCAL

您可以使用
DISCARD
命令来忘记准备好的语句,或者使用
DEALLOCATE
来忘记一个特定的准备好的语句。这在事务/连接池(如PgBouncer)中大量使用

(当然,所有涉及的交易必须在同一届会上进行,因为准备好的报表是特定于届会的)

事务是否绑定到创建它的连接

对。事务是会话的属性。不能在一个会话中挂起事务,然后在另一个会话中还原它。这将非常方便,但考虑到PostgreSQL基于流程的体系结构,这是非常不切实际的


像PgBouncer或PgPool II这样的工具可以通过提供更多灵活性的间接层来抽象连接。

嗯,我想2)是不正确的,因为1)冲突。假设每个事务/准备好的语句都是在随机连接上创建的。2) 只有在语句与事务在同一个连接上创建时才有效,不是吗?@ErikAigner transaction yes,session no.(2)指的是事务。我不太清楚“transaction yes,session no”是什么意思@ErikAigner您可以在同一个会话上跨多个事务重复使用准备好的语句。不能在不同会话(连接)之间重用它们。因此,我对(2)的回答以及为什么它与(1)不冲突。是的,我说每个查询可能使用不同的连接,因为我从连接池获取它们。因此,只有当我碰巧从创建PS的池中获得相同的连接时,它才会起作用。