SELECT프로세스 중에 들어오는 명령문에 영향을 미치지 않고 테이블의 전체 내용을 바꾸고 싶습니다 .
사용 사례는 정기적으로 추출되어 PostgreSQL 테이블에 저장해야하는 사서함 정보를 저장하는 테이블을 보유하는 것입니다. 동일한 테이블을 지속적으로 쿼리하는 응용 프로그램을 사용하는 많은 클라이언트가 있습니다.
일반적으로 (의사 코드 수신)과 같은 작업을 수행합니다 ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
그러나 불행히도이 프로세스 동안 테이블을 읽을 수 없습니다. INSERT INTO완료 하는 데 걸리는 시간으로 인해 테이블이 잠겨 있습니다.
MySQL에서는 RENAME TABLE이러한 문제를 피하기 위해 원자 명령을 사용했을 것입니다 ...
CREATE TABLE table_new LIKE table;
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
PostgreSQL에서 어떻게 이것을 달성 할 수 있습니까?
이 질문의 목적을 위해 외래 키를 사용하지 않는다고 가정 할 수 있습니다.
TRUNCATE명령은 테이블에서 AccessExclusive 잠금을 획득하므로 해당 트랜잭션이 커밋되거나 롤백 될 때까지 다른 사람이 테이블에서 읽을 수 없습니다.
delete대신 사용하면 truncate속도가 느려지지만 독자를 차단하지는 않습니다. 몇 개의 행을 삭제해야합니까?
DELETE과는 INSERT너무 긴 것입니다.