연결이 끊어 지거나 끊어진 경우 Postgres 장기 실행 쿼리가 중단됩니까?


20

Postgres에 대한 연결을 열고 장기 실행 쿼리를 실행 한 다음 연결을 끊는 경우 (예 : 연결을 연 클라이언트 프로세스 종료) 장기 실행 쿼리가 계속 실행됩니까, 아니면 자동으로 중단됩니까? 이 구성 가능합니까?

(Postgresql 9.2.9를 사용하고 있습니다)

답변:


32

"때에 따라 다르지".

네트워크 연결 손실로 인해 클라이언트가 사라지면 일반적으로 쿼리는 네트워크 전송 버퍼를 채우기에 충분한 행을 검색 할 때까지 실행 된 다음 TCP 연결이 끊어 질 때까지 중지 된 후 중단됩니다. 이 완료되면 전에 성공적으로 완료 할 수 있습니다 버퍼가의 TCP의 전송을 채 웁니다 그래서 그것의 자동 커밋 경우 쿼리가 커밋됩니다.

클라이언트 운영 체제가 클라이언트 segfault / crash, SIGTERM, SIGKILL 등과 같은 TCP RST를 통해 서버에보고 할 수있는 방식으로 클라이언트가 종료되면 PostgreSQL 서버는 인터럽트 플래그를 설정합니다. 다음에 쿼리가 실행될 때 인터럽트를 확인하면 플래그가 표시되고 중단됩니다. 때때로 쿼리는 인터럽트 (일부 확장 및 PostgreSQL 코어 내의 일부)를 확인하지 않는 코드 내에서 CPU가 많은 작업을 수행하는 경우가 있습니다.이 경우 오랜 시간 동안 인터럽트가 발생하지 않고 계속 실행되지 않을 수 있습니다. 그러나 자동 커밋 인 경우 완료하고 커밋하기 전에 항상 인터럽트를보고 중단합니다.

갑작스러운 OS 재부팅과 같은 이유로 클라이언트가 종료되어 클라이언트 호스트가 갑자기 TCP 연결에 대해 아무 것도 알지 못하지만 여전히 네트워크에서 응답 할 수 있으면 행을 처음 쓰려고 시도 할 때 쿼리가 중단 될 수 있습니다. Jeff는 클라이언트 호스트가 재부팅 후 서버가 보낸 첫 번째 패킷에 대한 응답으로 TCP RST를 전송하기 때문에 말했다. PostgreSQL은 전송하는 각 행에서 인터럽트를 확인합니다.

이 동작은 구성 할 수 없습니다. PostgreSQL과 관련하여 클라이언트가 사라지면 작업이 클라이언트에서 실행중인 쿼리를 종료하는 것입니다. 쿼리 시작시 얻을 수있는 일종의 쿼리 완료 토큰이 필요하다는 것을 변경하려면 나중에 다른 연결을 통해 서버에 쿼리를 요청하는 데 사용하십시오. 기본적으로 비동기 / 백그라운드 쿼리를 구현해야합니다. 아마도 좋은 기능이지만 현재 지원되지는 않습니다.

쿼리가 자동 커밋되거나 COMMIT클라이언트가 연결을 끊거나 연결을 잃어 버렸을 때 쿼리가 진행중인 쿼리 인 경우 트랜잭션이 클라이언트가 알 수없는 커밋되지 않았습니다. 트랜잭션이 데이터에 미치는 영향을 찾는 것 외에는 알아낼 실제 방법이 없습니다.

받아 들일 수없는 곳에서는 2 단계 커밋 과 클라이언트 쪽 트랜잭션 관리자를 사용할 수 있습니다 .


1
와우, 내가 찾던 것, 훌륭한 상세 답변! 감사합니다 @Craig_Ringer!
Rob Bednark


2

연결로 행을 리턴하고 파손을 감지 할 때까지 계속 실행됩니다. 따라서 행을 반환하기 전에 모든 작업을 수행하는 쿼리의 경우 본질적으로 실행이 완료됩니다.


감사합니다 @jjanes. 이를 나타내는 문서 나 소스 코드를 가리킬 수 있습니까?
Rob Bednark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.