我想知道事务和预处理语句是如何确定范围的。对于作用域,我的意思是,如果它们被创建的特定连接或环境绑定。
更具体地说:
当然仅限于一位客户。
答案 0 :(得分:3)
准备好的语句可以在其创建的连接上重用吗?
不,这是特定的会话(连接)。
术语“会话”和“连接”目前在PostgreSQL中是可以互换的,因为没有办法保存会话并在以后的连接上恢复它。
如果在事务之外创建了预准备语句,那么它是否可以在事务中使用,反之亦然?
是。准备好的语句是会话级的,而不是事务级的。事务级准备语句没有PREPARE LOCAL
,如事务局部变量的SET LOCAL
。
您可以使用DISCARD
命令忘记预准备语句,或DEALLOCATE
忘记一个特定的预准备语句。这在PgBouncer等交易/连接处理器中使用很多。
(当然,所有涉及的事务必须在同一个会话中,因为预准备的语句是特定于会话的。)
事务是否绑定了它在其上创建的连接?
是。事务是会话的属性。您不能在一个会话中暂停事务并在另一个会话中恢复它。它非常方便,但鉴于PostgreSQL基于流程的架构,它是非常不切实际的。
像PgBouncer或PgPool-II这样的工具允许您通过间接层抽象连接,从而提供更大的灵活性。