交易范围和准备好的报表

时间:2013-12-31 10:32:35

标签: sql postgresql

我想知道事务和预处理语句是如何确定范围的。对于作用域,我的意思是,如果它们被创建的特定连接或环境绑定。

更具体地说:

  • 准备好的声明是否可以在其创建的连接上重用?
  • 如果在事务之外创建了一个准备好的语句,那么它是否可以在事务中使用,反之亦然?
  • 是否将事务绑定到在其上创建的连接?

当然仅限于一位客户。

1 个答案:

答案 0 :(得分:3)

  

准备好的语句可以在其创建的连接上重用吗?

不,这是特定的会话(连接)。

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

  

如果在事务之外创建了预准备语句,那么它是否可以在事务中使用,反之亦然?

是。准备好的语句是会话级的,而不是事务级的。事务级准备语句没有PREPARE LOCAL,如事务局部变量的SET LOCAL

您可以使用DISCARD命令忘记预准备语句,或DEALLOCATE忘记一个特定的预准备语句。这在PgBouncer等交易/连接处理器中使用很多。

(当然,所有涉及的事务必须在同一个会话中,因为预准备的语句是特定于会话的。)

  

事务是否绑定了它在其上创建的连接?

是。事务是会话的属性。您不能在一个会话中暂停事务并在另一个会话中恢复它。它非常方便,但鉴于PostgreSQL基于流程的架构,它是非常不切实际的。

像PgBouncer或PgPool-II这样的工具允许您通过间接层抽象连接,从而提供更大的灵活性。

相关问题