Sql 在读提交隔离级别的CTE子句中是否可能有不同的结果?

Sql 在读提交隔离级别的CTE子句中是否可能有不同的结果?,sql,postgresql,Sql,Postgresql,在read committed隔离级别中,同一事务中的两个后续select查询可能会有不同的结果,因为这两个查询之间可能有并发更新: transaction 1: select id from table; => returns [1, 2, 3] transaction 2: delete from table where id = 2; transaction 1: select id from table; => returns [1, 3] 如果事务1中的s

read committed
隔离级别中,同一事务中的两个后续select查询可能会有不同的结果,因为这两个查询之间可能有并发更新:

transaction 1: select id from table;
    => returns [1, 2, 3]
transaction 2: delete from table where id = 2;
transaction 1: select id from table;
    => returns [1, 3]
如果事务1中的select查询合并到一个CTE中,会发生什么情况?假设我有以下虚拟查询:

with
cte_1 as (select id from table),
cte_2 as (select id from table)
select (select count(*) from cte_1, select count(*) from cte_2)

如果在执行
cte_1
cte_2
之间进行同步更新,我们是否也可能得到不同的结果?

每个语句都是以原子方式执行的,并且在整个运行时都会看到数据库的一致视图。“两个CTE”是一个单个查询,因此查询在运行时也不会看到任何(已提交的)更改

CTE查询相当于:

select (select count(*) from (select id from table) as cte1), 
       (select count(*) from (select id from table) as cte2)


不相关,但是:您可能不知道
select(a,b)
在Postgres中与
select a,b
不同。第一个返回一个匿名记录类型的列(有两个字段),第二个返回两列

每个语句都以原子方式执行,并在整个运行时看到数据库的一致视图。“两个CTE”是一个单个查询,因此查询在运行时也不会看到任何(已提交的)更改

CTE查询相当于:

select (select count(*) from (select id from table) as cte1), 
       (select count(*) from (select id from table) as cte2)


不相关,但是:您可能不知道
select(a,b)
在Postgres中与
select a,b
不同。第一个返回一个匿名记录类型的列(有两个字段),第二个返回两列

谢谢,很有趣!另外,关于
(a,b)
a,b
的对比,我在写问题时并没有真正意识到这一点。“这两个CTE是一个单一的查询,因此查询在运行时也看不到任何(已提交的)更改。”我在一些地方看到过这一说法,但我无法找到权威的来源(就像PostgreSQL手册中的一节或一句话)来确认它。有指针吗?@AndresRiofrio:“当事务使用此隔离级别时,SELECT查询(…)只看到在查询开始之前提交的数据;它从不看到未提交的数据或并发事务在查询执行期间提交的更改”@一个没有正确名称的\u horse\u,但这并不清楚它是指每个根SELECT查询还是每个SELECT查询,甚至是子查询。事实上,对我来说,它似乎是指后者。一条语句就是一条语句。谢谢,非常有趣!还有关于
(a,b)的评论
a,b
相比,我在写问题时并没有真正意识到这一点。“这两个CTE是一个查询,因此该查询在运行时也没有看到任何(已提交的)更改。”我在一些地方看到过这种说法,但我还没有找到权威的来源(就像PostgreSQL手册中的一节或一句话)来确认它。有指针吗?@AndresRiofrio:“当事务使用此隔离级别时,SELECT查询(…)只看到在查询开始之前提交的数据;它从不看到未提交的数据或并发事务在查询执行期间提交的更改”@一个没有正确名称的\u horse\u,但这并不清楚它是指每个根SELECT查询还是每个SELECT查询,甚至是子查询。事实上,对我来说,它似乎是指后者。一条语句就是一条语句。