Sql 交易范围和编制的报表
我想知道事务和准备好的语句是如何界定范围的。对于scoped,我的意思是它们是否绑定到创建它们的特定连接或环境 更具体地说:Sql 交易范围和编制的报表,sql,postgresql,Sql,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的池中获得相同的连接时,它才会起作用。