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의 문장 실행에 대한 내부 동시성 모델에 대해서는 잘 모르겠습니다. 하지만 누구나 원하는대로 세부 사항에 들어가기를 원한다면, 그럴 것입니다.]
그것은 중복 키 오류로 원하는 upsert을 수행하거나 실패하거나 그 진술처럼 나에게 보인다. 오류시 * 요청 된 활동의 * none *이 지속되므로 중복 키 오류에 대한 재 시도가 안전합니다. – kgrittn