Postgresql 什么';读提交隔离级别中的确切命令定义是什么?

Postgresql 什么';读提交隔离级别中的确切命令定义是什么?,postgresql,Postgresql,假设我们使用自动提交模式,即 默认情况下(不带BEGIN),PostgreSQL在中执行事务 “自动提交”模式,即每个语句都以其自己的方式执行 事务和提交在事务结束时隐式执行 语句(如果执行成功,则执行回滚) 然后使用readcommitted隔离级别(在postgresql中也是默认的),语句就是实际的隔离单元。但这里的陈述只是指外部陈述?那么嵌入在同一外部语句中的语句呢 CTE(带查询) 我测试了一些情况,似乎主查询和所有WITH查询共享同一个事务快照,尽管由于依赖关系,一些查询可能在另

假设我们使用自动提交模式,即

默认情况下(不带BEGIN),PostgreSQL在中执行事务 “自动提交”模式,即每个语句都以其自己的方式执行 事务和提交在事务结束时隐式执行 语句(如果执行成功,则执行回滚)

然后使用readcommitted隔离级别(在postgresql中也是默认的),语句就是实际的隔离单元。但这里的陈述只是指外部陈述?那么嵌入在同一外部语句中的语句呢

  • CTE(带查询)
我测试了一些情况,似乎主查询和所有WITH查询共享同一个事务快照,尽管由于依赖关系,一些查询可能在另一个之后发生

with a as
(
statements...
),
b as (
statements depends on a, e.g. from a,
)
main query
如果在整个查询运行期间,新事务已提交,那么此处的任何(子)查询是否应看到新数据

  • 触发器函数中的语句
很容易测试并知道触发器函数中的每个语句都满足读取提交的隔离级别规则,即每个语句在开始执行之前都会看到所有提交事务中的数据

outer dml statement ----trigger---> foobar()
                                        statement1
                                        statement2
                                        ....
如果在语句1之后提交了其他事务,则语句2将看到新数据

  • 子查询
考虑WHERE部分中的子查询,很难测试子查询的每次执行是否会看到来自其他提交事务的新数据,因为优化器主要会将子查询转换为join

select * from foo where col1 > any(select col1 from bar where ....);
如果在第二次运行子查询(哪个修改的表栏)之后提交了其他事务,那么第三次运行子查询是否会看到新数据


根据这个主题,我还没有读过postgresql的源代码,有人知道答案吗?

我在pgsql通用邮件列表中问了一个问题:

现在我找到了答案:

对于所有情况(触发器、CTE、其他子查询),只要 他们使用PL编写的函数,并将其标记为VOLATILE(默认情况下),然后 函数中包含的每个查询都可能会看到新数据

稳定且不可变的函数使用自 开始调用查询,而VOLATILE函数获得一个新的 在它们执行的每个查询的开始处创建快照


你的问题到底是什么?隔离级别是关于其他事务更改的可见性,而不是语句。对不起,我编辑我的问题以提供更多的描述。CTE或子查询仍然是单个语句。因此触发器是唯一的例外?我的意思是隔离影响:除了触发器和外部语句所属的事务之外,每个语句可能会看到来自其他新提交事务的数据。