이 섹션에서는 메시지 흐름을 설명합니다. 4 개가 있습니다 연결 상태에 따라 다른 유형의 흐름 : 시작, 쿼리, 기능 호출 및 종료. 또한 있습니다 통지 응답 및 명령에 대한 특별 조항 시작 후 언제든지 발생할 수있는 취소 단계.
스타트 업은 인증 단계와 백엔드로 나뉩니다. 스타트 업 단계.
Initially, the frontend sends a StartupPacket. The postmaster uses this info and the contents of the pg_hba.conf(5) file to determine what authentication method the frontend must use. 그만큼 postmaster then responds with one of the following messages:
우체국 장은 즉시 연결을 닫습니다.
우체국 장은 백엔드로 넘어갑니다. 그만큼 우체국 장은 커뮤니케이션에 더 이상 참여하지 않습니다.
프론트 엔드는 Kerberos v4에 참여해야합니다. 포스트 마스터와 인증 대화 상자 (여기에 설명되지 않음). 이것이 성공하면 우체국 장은 An과 응답합니다 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.
프론트 엔드는 Kerberos v5에 참여해야합니다. 포스트 마스터와 인증 대화 상자 (여기에 설명되지 않음). 이것이 성공하면 우체국 장은 An과 응답합니다 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.
프론트 엔드는 암호화되지 않은 passwordpacket을 보내야합니다. 만약에 이것은 올바른 비밀번호이며 우체국 장은 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.
프론트 엔드는 암호화 된 PasswordPacket을 보내야합니다. 만약에 이것은 올바른 비밀번호이며 우체국 장은 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.
프론트 엔드가 인증 방법을 지원하지 않는 경우 우체국 장이 요청한 다음 즉시 닫아야합니다. 연결.
Authenticationok을 보내 후 우체국 장은 시도합니다 백엔드 프로세스를 시작하십시오. 이것이 실패하거나 백엔드가 될 수 있기 때문입니다 스타트 업 중에 실패가 발생할 수 있습니다. 프론트 엔드는 기다려야합니다. 백엔드가 성공적인 시작을 인정하기 위해. 프론트 엔드 이 시점에서 메시지를 보내지 않아야합니다. 가능한 메시지 이 단계의 백엔드는 다음과 같습니다.
이 메시지는 성공적인 백엔드 시작 후에 발행됩니다. 그것 프론트 엔드가 저장 해야하는 비밀 키 데이터를 제공합니다. 나중에 취소 요청을 발행 할 수 있기를 원합니다. 프론트 엔드 이 메시지에 응답해서는 안되지만 계속해야합니다 ReadyForquery 메시지 듣기.
백엔드 시작이 성공했습니다. 프론트 와이즈 토토 이제 발행 될 수 있습니다 쿼리 또는 기능 전화 메시지.
백엔드 시작이 실패했습니다. 연결이 닫힙니다 이 메시지 보내기.
경고 메시지가 발행되었습니다. 프론트 엔드 메시지를 표시하지만 ReadyForquery를 계속 듣습니다 ErrorResponse.
ReadyForquery 메시지는 백엔드가 동일합니다. 각 쿼리주기 후에 문제가 발생합니다. 코딩 요구에 따라 프론트 엔드, readyforquery를 시작하는 것으로 간주하는 것이 합리적입니다. 쿼리 사이클 (그리고 BackendkeyData는 성공을 나타냅니다 시작 단계의 결론) 또는 ReadyForquery를 시작 단계 및 각 후속 쿼리주기 종료.
쿼리주기는 쿼리를 보내는 프론트 엔드에 의해 시작됩니다. 백엔드에 대한 메시지. 그런 다음 백엔드는 하나 이상의 응답을 보냅니다 쿼리 명령 문자열의 내용에 따라 메시지를 보내고 마지막으로 ReadyForquery 응답 메시지. ReadyForquery는 다음을 알려줍니다 새 쿼리 또는 기능 호출을 안전하게 보낼 수 있다는 프론트 엔드.
백엔드의 가능한 응답 메시지는 다음과 같습니다.
정상적으로 완료된 SQL 명령.
The backend is ready to copy data from the frontend to a 관계. The frontend should then send a CopyDataRows message. The backend will then respond with a CompletedResponse message "복사"의 태그와 함께.
백엔드는 관계에서 데이터를 복사 할 준비가되었습니다. 프론트 엔드. 그런 다음 CopyDatarows 메시지를 보낸 다음 a "Copy"의 태그가있는 완료된 응답 메시지.
쿼리는 삽입 (l), delete (l), update (l)입니다. 페치 (l) 또는 select (l) 명령. 거래가 있었다면 중단 된 후 백엔드는 완성 된 응답 메시지를 보냅니다 "*Abort State*"의 태그. 그렇지 않으면 다음 응답이 있습니다 전송된.
For an insert(l) command, the backend then sends a CompletedResponse message with a tag of "INSERToid 행" 어디행줄이 삽입되고OID입니다 삽입 된 행의 객체 ID행is 1, 그렇지 않으면OIDis 0입니다.
삭제 (l) 명령의 경우 백와이즈 토토 a를 보냅니다 "delete의 태그가 포함 된 완료된 응답 메시지행"여기서행삭제 된 행 수입니다.
업데이트 (l) 명령의 경우 백와이즈 토토 a를 보냅니다 "update의 태그가 포함 된 완료된 응답 메시지행"여기행삭제 된 행 수입니다.
Fetch (L) 또는 SELECT (L) 명령의 경우 백엔드는 rowdescription 메시지. 그런 다음 Asciirow 또는 이어집니다 이진 커서 의지 여부에 따라 바이러 로우 메시지 지정) 각 행에 대해 프론트 엔드로 반환됩니다. 마지막으로, 백엔드는 a로 완성 된 응답 메시지를 보냅니다 "select"의 태그.
빈 쿼리 문자열이 인식되었습니다. (특별히 필요합니다 이 사례를 구별하는 것은 역사적입니다.)
오류가 발생했습니다.
쿼리 문자열의 처리가 완료되었습니다. 별도 쿼리 문자열이 여러 SQL 명령을 포함합니다. (완성 된 응답은 끝을 표시합니다 전체 문자열이 아닌 하나의 SQL 명령을 처리합니다.) 처리 여부에 관계없이 ReadyForquery는 항상 전송됩니다 성공적으로 종료되거나 오류가 발생합니다.
쿼리와 관련하여 경고 메시지가 발행되었습니다. 통지는 다른 응답에 추가됩니다. 백엔드 명령을 계속 처리 할 것입니다.
프론트 엔드는 ErrorResponse를 수락 할 준비를해야합니다 다른 유형의 다른 유형을 예상 할 때마다 aliceresponse 메시지 메시지.
실제로, 주석에 도착할 수 있습니다. 프론트 와이즈 토토 어떤 종류의 메시지도 기대하지 않습니다. 백와이즈 토토 명목상 유휴 상태입니다. (특히 백와이즈 토토 될 수 있습니다 우체국 장에 의해 종료되도록 명령했습니다. 이 경우 보내집니다 연결을 닫기 전에 주석에 대한 반응.) 권장됩니다 바로 직전에 그러한 비동기 통지를 확인하는 것이 좋습니다. 새로운 명령 발행.
또한 프론트 엔드가 청취 (l) 명령을 발행하는 경우 언제든지 NotificationResponse 메시지를 수락 할 준비를하십시오. 아래를 참조하십시오.
기능 호출주기는 전면 엔드에 의해 시작됩니다. 백엔드에 대한 기능을하는 메시지. 그런 다음 백엔드는 하나를 보냅니다 함수 결과에 따라 더 많은 응답 메시지 전화를 걸어 마지막으로 ReadyForquery 응답 메시지. ReadyForquery 프론트 엔드에 새 쿼리를 안전하게 보낼 수 있거나 기능 호출.
백엔드의 가능한 응답 메시지는 다음과 같습니다.
오류가 발생했습니다.
함수 호출이 실행되어 결과를 반환했습니다.
함수 호출이 실행되어 결과가 없습니다.
함수 호출 처리가 완료되었습니다. ReadyForquery 처리가 성공적으로 종료되는지 여부에 관계없이 항상 전송됩니다 또는 오류가 있으면
경고 메시지가 기능 호출. 통지는 다른 응답에 추가됩니다. 백와이즈 토토 계속해서 명령을 처리합니다.
ErrorResponse를 수락하기 위해 프론트 엔드를 준비해야합니다 다른 유형의 다른 유형을 예상 할 때마다 aliceresponse 메시지 메시지. 또한, 청취 명령을 발행하는 경우 언제든지 NotificationResponse 메시지를 수락 할 준비; 보다 아래에.
프론트 엔드가 듣기 (l) 명령을 내리는 경우 백엔드가 kitificationResponse 메시지를 보냅니다 (혼동되지 않아야합니다 aliceresponse!) 알림 (l) 명령이 실행될 때마다 동일한 알림 이름.
통지 응답은 어느 시점에서나 허용됩니다 다른 백엔드 메시지를 제외하고 프로토콜 (시작 후). 따라서 프론트 엔드는 a 메시지가 예상 될 때마다 NotificationResponse 메시지. 실제로, NotificationResponse 메시지를 처리 할 수 있어야합니다 쿼리에 참여하지 않더라도.
알림 (l) 명령이 이름에 대해 실행되었습니다. 이전 청취 (l) 명령이 실행되었습니다. 알림이있을 수 있습니다 언제든지 보냈습니다.
듣고 사용 된 이름을 지적하는 것이 가치가있을 수 있습니다. 알림 명령은 이름과 관련이 없을 필요가 없습니다. SQL 데이터베이스의 관계 (테이블). 알림 이름입니다 단순히 임의로 선택한 조건 이름.
During the processing of a query, the frontend may request cancellation of the query by sending an appropriate request to the postmaster. The cancel request is not sent directly to the backend for reasons of implementation efficiency: we don't want to have the backend constantly checking for new input from the frontend during query processing. Cancel requests should be relatively infrequent, 그래서 우리는 페널티를 피하기 위해 약간 번거로운 the normal case.
취소 요청을 발행하려면 Frontend가 새로운 연결을 엽니 다. 우체국 장에게 일반적으로 전송되는 startuppacket 메시지 새로운 연결. 우체국 장은이 요청을 처리 할 것입니다 연결을 닫으십시오. 보안상의 이유로 직접 답변은 없습니다 취소 요청 메시지에.
CalcelRequest 메시지가 포함되지 않으면 무시됩니다. 동일한 키 데이터 (PID 및 Secret Key)가 전면에 전달되었습니다. 연결 시작. 요청이 PID 및 비밀 키와 일치하는 경우 현재 실행중인 백엔드의 경우 우체국 장은 신호를 보냅니다 현재 쿼리의 처리 중단을위한 백엔드.
취소 신호는 어떤 효과가 있거나 없을 수도 있습니다 --- 예를 들어, 백엔드가 처리가 완료된 후에 도착하면 쿼리는 효과가 없습니다. 취소가있는 경우 효과적으로, 현재 명령이 조기에 종료됩니다. 오류 메시지와 함께.
이 모든 것의 결과는 보안과 효율성, 프론트 엔드는 취소 여부를 알 수있는 직접적인 방법이 없습니다. 요청이 성공했습니다. 백엔드가 계속 기다려야합니다 쿼리에 응답하십시오. 취소를 발행하면 단순히 확률이 향상됩니다 현재 쿼리가 곧 완료 될 것이며 성공 대신 오류 메시지로 실패합니다.
취소 요청이 우체국 장에게 전송되기 때문에 정기적 인 프론트 엔드/백엔드 커뮤니케이션 링크에서 모든 프로세스에서 취소 요청을 발행 할 수 있습니다. 쿼리가 취소 될 프론트 엔드 만. 이것은 일부가있을 수 있습니다 다중 프로세스 애플리케이션 구축의 유연성의 이점. 또한 승인되지 않은 사람들에게 보안 위험을 소개합니다. 쿼리를 취소하려고 할 수 있습니다. 보안 위험은 해결됩니다 동적으로 생성 된 비밀 키를 제공해야합니다. 요청 취소.
정상적이고 우아한 종료 절차는 정면입니다 종료 메시지를 보내고 즉시 연결을 닫습니다. ~에 메시지를받은 백엔드는 즉시 닫습니다 연결 및 종료.
소프트웨어 고장으로 인해 격렬한 종료가 발생할 수 있습니다 (i.e., core dump) at either end. 프론트 엔드 또는 백엔드가 보는 경우 an unexpected closure of the connection, it should clean up and 끝내다. The frontend has the option of launching a new backend by recontacting the postmaster, if it doesn't want to terminate 그 자체.