PostgreSQL 9.6 ERROR: snapshot too old

http://postgresql.kr/blog/pg_snapshot_too_old.html
이 오류는 보편적인 업무 환경에서 나타날 수 있는 상황을 설명합니다.

세션A에서 cursor를 쓰기 위해서,
begin;
declare cur1 cursor for select * from test_table;
-- 첫 데이터를 가져오고
fetch first from cur1;
-- 그 자료를 업데이트함
update test_table set ..... where pk= 1;

이 상황에서
세션B가 똑 같이
begin;
declare cur1 cursor for select * from test_table;
-- 첫 데이터를 가져오고
fetch first from cur1;

세션B에서 update 하려고 하는데, 세션A에서 commit 일어남
그러면, 일반적인 상황에서는 세션B에서는 해당 pk의 로우가 없어, 어떤 자료도 변경되지 않았다고 나옵니다.

그럼 다시, 세션B에서
fetch first from cur1;
하면, old 자료가 보입니다.

이때, 서버 환경 설정 변수 old_snapshot_threshold 서버 환경 설정 변수값으로 -1 이상으로 지정했다면, (1분부터 60일까지) 그 기간이 지나고 난 뒤, vacuum 작업이 있으면, 세션B에서 가지고 있던 snapshot은 너무 옛날 것으로 판단해서 vacuum 작업에서 그 old version 자료는 더이상 참조 할 수 없게 되어버립니다.

세션B에서
다시
fetch first from cursor1;
명령을 내려면, snapshot too old 오류 메시지를 보게됩니다.

즉, 이 설정과 그 처리 방식은 autovacuum 이 해당 테이블에 대한 vacuum 작업을 얼마나 빈번하게 하는가와, 세션이 얼마나 오랫동안 트랜잭션을 유지하고 있느냐에 따라 실무에서 충분히 나타날 수 있는 오류 메시지입니다.