读提交(READ-COMMITTED)事务中每个WITH查询是否算作独立命令?
结论
你示例中的WITH子句里的两个SELECT查询属于单个SQL命令,在READ COMMITTED(读提交)隔离级别下,不会出现两个查询读取到不同行的情况。
原理说明
- PostgreSQL的READ COMMITTED隔离级别规则明确:单个SQL命令执行的全程,只会使用命令启动瞬间生成的、已提交数据的一致性快照,命令执行过程中其他事务提交的修改,对当前命令完全不可见。
- 你给出的代码中,包含WITH子句的整段SELECT逻辑是一条独立的SQL命令,foo、bar两个CTE里的查询都是这条命令的组成部分,共享同一个快照,因此两次对表t1的查询读到的是完全一致的数据。
对比:会出现不可重复读的场景
只有事务内执行两条独立的SELECT命令时,才会因为每条命令单独获取新快照,出现前后两次查询结果不一致的情况:
BEGIN; -- 第一条独立SELECT,生成快照1 SELECT * FROM t1; -- 执行间隙如果有其他事务修改t1并提交,第二条SELECT会生成包含新修改的快照2 SELECT * FROM t1; COMMIT;
内容的提问来源于stack exchange,提问作者leinaD_natipaC
相关产品推荐
相关产品推荐

