2017-12-31 39 views
0

, 동일한 트랜잭션 2 개 이후의 선택 쿼리는 두 쿼리 사이에 동시 업데이트가 있었다 수 있기 때문에, 다른 결과를 가질 수 있습니다READ COMMITTED 격리 수준에서 CTE 절에 다른 결과를 가질 수 있습니까? <code>read committed</code> 격리 수준에서

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 선택 쿼리의 경우 CTE에서 결합됩니까? 동시 업데이트가 cte_1cte_2의 실행 사이에 오면

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) 

는 지금 우리가 다른 결과를 얻을 가능성도 있습니다 : 나는 다음과 같은 더미 쿼리가 있다고?

답변

4

모든 명령문은 원자 단위로 실행되며 런타임 동안 데이터베이스의 일관된 뷰를 보게됩니다.

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

관련없는에게 : 해당 쿼리는 어떤 (커밋) 변경이 이루어 참조하지 않도록 자사의

을 실행하는 동안 "두 열팽창 계수"는 CTE 쿼리에 해당하는 단일 쿼리입니다 그러나 : select (a,b)이 Postgres에서 다른 무엇인지 알지 못할 수도 있습니다. select a,b. 첫 번째는 익명 레코드 유형 (두 개의 필드가있는)과 두 번째 열이 두 개의 열을 반환하는 단일 열을 반환합니다.

+0

감사합니다. 매우 흥미 롭습니다. 또한'(a, b)'와'a, b'에 대한 언급에 대해서, 나는이 질문을 쓸 때 실제로 그것을 깨닫지 못했습니다. –

관련 문제