0

postgres-9.1에서 특히이 사이트에서 쓰기 가능한 공통 테이블 표현식을 사용하는 방법을 배웠습니다.postgresql 쓰기 가능한 공통 테이블 식 동시성

WITH upsert as 
(update mytable2 m set sales=m.sales+d.sales, status=d.status from mytable d where m.pid=d.pid 
    RETURNING m.* 
) 
insert into mytable2 select a.pid, a.sales,'NEW' from mytable a where a.pid not in (select b.pid from upsert b); 

http://vibhorkumar.wordpress.com/2011/10/26/upsertmerge-using-writable-cte-in-postgresql-9-1/ 나는 일부 동료에게이 문제를 언급하고이 같은 작업을 수행 할 때 사용하는 포스트 그레스 동시성 모델/안전에 대해 질문했다. 내 첫 번째 생각은 모든 상황에서 스레드가 안전해야하므로 mytable이 명령문의 전체 실행을 위해 잠긴 것입니다.

올바른 가정입니까? postgres의 문장 실행에 대한 내부 동시성 모델에 대해서는 잘 모르겠습니다. 하지만 누구나 원하는대로 세부 사항에 들어가기를 원한다면, 그럴 것입니다.]

답변

1

PostgreSQL은 MVCC를 통해 동시 작업을 처리하므로 기본 CRUD 작업이 결코 잠금되지 않습니다.

트랜잭션은 시작 전에 커밋 된 데이터 만 표시합니다. 실행 중일 때 외부에서 발생하는 변경 사항에 대해서는 통보를받지 않습니다. 즉, 변경 사항 만 보게됩니다.

다른 프로세스가 병렬로 데이터를 변경하지 않도록하려면 명시 적 잠금을 설정해야합니다.

좋은 읽기는 문서에 있습니다 http://www.postgresql.org/docs/current/static/mvcc-intro.html

+1

그것은 중복 키 오류로 원하는 upsert을 수행하거나 실패하거나 그 진술처럼 나에게 보인다. 오류시 * 요청 된 활동의 * none *이 지속되므로 중복 키 오류에 대한 재 시도가 안전합니다. – kgrittn