포스트그레SQL테이블의 데이터에 대한 동시 액세스를 제어하는 다양한 윈 토토 모드를 제공합니다. 이러한 모드는 다음과 같은 상황에서 애플리케이션 제어 윈 토토에 사용될 수 있습니다.MVCC원하는 동작을 제공하지 않습니다. 또한 대부분의포스트그레SQL명령은 명령이 실행되는 동안 참조된 테이블이 호환되지 않는 방식으로 삭제되거나 수정되지 않도록 자동으로 적절한 모드의 윈 토토을 획득합니다. (예를 들어,잘라내기동일한 테이블의 다른 작업과 동시에 안전하게 실행할 수 없으므로접속 독점이를 적용하려면 테이블을 잠그세요.)
데이터베이스 서버에서 현재 해결되지 않은 윈 토토 목록을 검사하려면 다음을 사용하십시오.pg_locks시스템 보기. 윈 토토 관리자 하위 시스템의 상태 모니터링에 대한 자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 12 : 27 장. 데이터베이스 활동 배트맨 토토.
아래 목록은 사용 가능한 윈 토토 모드와 자동으로 사용되는 컨텍스트를 보여줍니다.PostgreSQL. 다음 명령을 사용하여 이러한 윈 토토을 명시적으로 획득할 수도 있습니다.윈 토토. 이름에라는 단어가 포함되어 있더라도 이러한 윈 토토 모드는 모두 테이블 수준 윈 토토이라는 점을 기억하세요.“행”; 윈 토토 모드의 이름은 역사적입니다. 어느 정도 이름은 각 윈 토토 모드의 일반적인 사용법을 반영하지만 의미는 모두 동일합니다. 하나의 윈 토토 모드와 다른 윈 토토 모드 사이의 유일한 실제 차이점은 각 윈 토토 모드가 충돌하는 윈 토토 모드 세트입니다(참조표 13.2). 두 트랜잭션은 동시에 동일한 테이블에서 충돌하는 모드의 윈 토토을 보유할 수 없습니다. (그러나 트랜잭션은 결코 그 자체와 충돌하지 않습니다. 예를 들어 다음을 획득할 수 있습니다.접속 독점윈 토토 후 나중에 획득액세스 공유같은 테이블에 대한 윈 토토.) 충돌하지 않는 윈 토토 모드는 많은 트랜잭션에 의해 동시에 유지될 수 있습니다. 특히 일부 윈 토토 모드는 자체 충돌을 일으킵니다(예:접속 독점한 번에 두 개 이상의 트랜잭션이 윈 토토을 보유할 수 없음) 다른 트랜잭션은 자체 충돌을 일으키지 않습니다(예:액세스 공유윈 토토은 여러 트랜잭션에 의해 유지될 수 있습니다).
테이블 수준 윈 토토 모드
액세스 공유 (액세스공유윈 토토)다음과의 충돌접속 독점윈 토토 모드 전용.
그선택명령은 참조된 테이블에서 이 모드의 윈 토토을 획득합니다. 일반적으로 다음과 같은 모든 쿼리는읽기테이블을 수정하지 않으면 이 윈 토토 모드가 획득됩니다.
행 공유 (RowShareLock)다음과의 충돌독점그리고접속 독점윈 토토 모드.
그업데이트를 위해 선택그리고공유 선택명령은 대상 테이블에서 이 모드의 윈 토토을 획득합니다(추가로액세스 공유참조되었지만 선택되지 않은 다른 테이블에 대한 윈 토토업데이트용/공유용).
행 독점 (RowExclusiveLock)다음과의 충돌공유, 공유 행 독점, 독점및접속 독점윈 토토 모드.
명령어업데이트, 삭제및삽입대상 테이블에서 이 윈 토토 모드를 획득합니다(추가로액세스 공유다른 참조 테이블에 대한 윈 토토). 일반적으로 이 윈 토토 모드는 다음 명령에 의해 획득됩니다.데이터 수정테이블에.
업데이트 독점 공유 (ShareUpdateExclusiveLock)다음과의 충돌업데이트 독점 공유, 공유, 공유 행 독점, 독점및접속 독점윈 토토 모드. 이 모드는 동시 스키마 변경으로부터 테이블을 보호합니다.진공실행됩니다.
취득자진공(없음전체), 분석, 동시에 인덱스 생성, 통계 생성, 댓글 켜짐, 동시에 REINDEX, 그리고 특정색인 변경그리고테이블 변경변종(자세한 내용은 참조색인 변경그리고테이블 변경).
공유 (공유 윈 토토)다음과의 충돌행 독점, 업데이트 독점 공유, 행 독점 공유, 독점및접속 독점윈 토토 모드. 이 모드는 동시 데이터 변경으로부터 테이블을 보호합니다.
취득자색인 생성(없음동시).
공유 행 독점 (ShareRowExclusiveLock)다음과의 충돌행 독점, 업데이트 독점 공유, 공유, 공유 행 독점, 독점및접속 독점윈 토토 모드. 이 모드는 동시 데이터 변경으로부터 테이블을 보호하고, 한 번에 하나의 세션만 테이블을 보유할 수 있도록 자체 배타적입니다.
취득자트리거 생성및 일부 형태테이블 변경(참조테이블 변경).
독점 (독점 윈 토토)다음과의 충돌행 공유, 행 독점, 업데이트 독점 공유, 공유, 공유 행 독점, 독점및접속 독점윈 토토 모드. 이 모드는 동시만 허용합니다.액세스 공유윈 토토, 즉 테이블의 읽기만 이 윈 토토 모드를 유지하는 트랜잭션과 병렬로 진행될 수 있습니다.
취득자동시에 구체화된 보기 새로고침.
접속 독점 (AccessExclusiveLock)모든 모드의 윈 토토과 충돌합니다(액세스 공유, 행 공유, 행 독점, 업데이트 독점 공유, 공유, 행 독점 공유, 독점및접속 독점). 이 모드는 보유자가 어떤 방식으로든 테이블에 액세스하는 유일한 트랜잭션임을 보장합니다.
다음에 의해 획득됨드롭 테이블, 잘라내기, REINDEX, 클러스터, 진공 가득 참및구체화된 보기 새로고침(없이동시) 명령. 다양한 형태의색인 변경그리고테이블 변경또한 이 수준에서 윈 토토을 획득합니다. 이는 또한의 기본 윈 토토 모드입니다.락 테이블모드를 명시적으로 지정하지 않는 명령문.
만접속 독점윈 토토 블록 a선택(없이업데이트/공유용) 진술.
일단 윈 토토을 획득하면 일반적으로 트랜잭션이 끝날 때까지 윈 토토이 유지됩니다. 그러나 저장점을 설정한 후 윈 토토을 획득한 경우 저장점을 롤백하면 윈 토토이 즉시 해제됩니다. 이는 다음의 원칙과 일치합니다.롤백저장점 이후 명령의 모든 효과를 취소합니다. a 내에서 획득한 윈 토토에 대해서도 동일한 보유가 이루어집니다.PL/pgSQL예외 블록: 블록에서 오류가 발생하면 그 안에서 획득한 윈 토토이 해제됩니다.
표 13.2. 윈 토토 모드 충돌
| 요청된 윈 토토 모드 | 현재 윈 토토 모드 | |||||||
|---|---|---|---|---|---|---|---|---|
| 액세스 공유 | 행 공유 | 행 독점 | 업데이트 독점 공유 | 공유 | 행 독점 공유 | 독점 | 접속 독점 | |
| 액세스 공유 | X | |||||||
| 행 공유 | X | X | ||||||
| 행 독점 | X | X | X | X | ||||
| 업데이트 독점 공유 | X | X | X | X | X | |||
| 공유 | X | X | X | X | X | |||
| 공유 행 독점 | X | X | X | X | X | X | ||
| 독점 | X | X | X | X | X | X | X | |
| 접속 독점 | X | X | X | X | X | X | X | X |
테이블 수준 윈 토토 외에도 행 수준 윈 토토이 있으며 아래에 자동으로 사용되는 컨텍스트와 함께 나열되어 있습니다.PostgreSQL. 참조표 13.3행 수준 윈 토토 충돌에 대한 전체 표를 확인하세요. 트랜잭션은 다른 하위 트랜잭션에서도 동일한 행에 충돌하는 윈 토토을 보유할 수 있습니다. 그러나 그 외에는 두 트랜잭션이 동일한 행에서 충돌하는 윈 토토을 유지할 수 없습니다. 행 수준 윈 토토은 데이터 쿼리에 영향을 주지 않습니다. 그들은 단지 차단작가 및 사물함같은 행에. 행 수준 윈 토토은 테이블 수준 윈 토토과 마찬가지로 트랜잭션 종료 시 또는 저장점 롤백 중에 해제됩니다.
행 수준 윈 토토 모드
업데이트용업데이트용다음에 의해 검색된 행이 발생합니다.선택문은 업데이트를 위한 것처럼 잠깁니다. 이는 현재 트랜잭션이 종료될 때까지 다른 트랜잭션에 의해 잠기거나 수정되거나 삭제되는 것을 방지합니다. 즉, 시도하는 다른 거래입니다.업데이트, 삭제, 업데이트를 위해 선택, 키 업데이트 없음 선택, 공유 선택또는키 공유 선택이 행 중 현재 트랜잭션이 끝날 때까지 차단됩니다. 반대로,업데이트를 위해 선택동일한 행에서 해당 명령을 실행하는 동시 트랜잭션을 기다린 다음 업데이트된 행(또는 행이 삭제된 경우 행 없음)을 잠그고 반환합니다. a 이내반복 가능한 읽기또는직렬화 가능트랜잭션이지만 트랜잭션이 시작된 이후 잠길 행이 변경되면 오류가 발생합니다. 자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 12 : 13.4. 응용 프로그램 수준에서의 윈 토토 일관성 검사.
그업데이트용윈 토토 모드는 누구에 의해서도 획득됩니다.삭제행으로, 그리고 또한업데이트특정 열의 값을 수정합니다. 현재 고려되는 열 세트는업데이트사례는 외래 키에 사용할 수 있는 고유 인덱스가 있는 경우입니다(따라서 부분 인덱스 및 표현식 인덱스는 고려되지 않음). 이는 향후 변경될 수 있습니다.
키 업데이트가 없는 경우다음과 유사하게 동작함업데이트용, 획득한 윈 토토이 더 약한 것을 제외하고: 이 윈 토토은 차단되지 않습니다.키 공유 선택동일한 행에 대한 윈 토토 획득을 시도하는 명령입니다. 이 윈 토토 모드는 어떤 경우에도 획득됩니다.업데이트a를 얻지 못하는업데이트용윈 토토.
공유용다음과 유사하게 동작함키 업데이트가 없는 경우, 단, 검색된 각 행에 대해 배타적 윈 토토이 아닌 공유 윈 토토을 획득한다는 점은 제외됩니다. 공유 윈 토토은 다른 트랜잭션이 수행되는 것을 차단합니다.업데이트, 삭제, 업데이트를 위해 선택또는키 업데이트 없음 선택이 행에 있지만 실행을 방해하지는 않습니다.공유 선택또는키 공유 선택.
키 공유용다음과 유사하게 작동함공유용, 윈 토토이 더 약한 점 제외:업데이트를 위해 선택차단되었지만 차단되지는 않음키 업데이트 없음 선택. 키 공유 윈 토토은 다른 트랜잭션이 수행되는 것을 차단합니다.삭제또는 임의업데이트키 값을 변경하지만 다른 것은 변경하지 않음업데이트, 방지하지도 않습니다키 업데이트 없음 선택, 공유 선택또는키 공유 선택.
포스트그레SQL메모리의 수정된 행에 대한 정보를 기억하지 않으므로 한 번에 잠기는 행 수에는 제한이 없습니다. 그러나 행을 잠그면 디스크 쓰기가 발생할 수 있습니다. 예:업데이트를 위해 선택선택한 행을 수정하여 잠긴 것으로 표시하므로 디스크 쓰기가 발생합니다.
표 13.3. 행 수준 윈 토토 충돌
| 요청된 윈 토토 모드 | 현재 윈 토토 모드 | |||
|---|---|---|---|---|
| 키 공유용 | 공유용 | 키 업데이트가 없는 경우 | 업데이트용 | |
| 키 공유용 | X | |||
| 공유용 | X | X | ||
| 키 업데이트가 없는 경우 | X | X | X | |
| 업데이트용 | X | X | X | X |
테이블 및 행 윈 토토 외에도 페이지 수준 공유/독점 윈 토토은 공유 버퍼 풀의 테이블 페이지에 대한 읽기/쓰기 액세스를 제어하는 데 사용됩니다. 이러한 윈 토토은 행을 가져오거나 업데이트한 직후에 해제됩니다. 애플리케이션 개발자는 일반적으로 페이지 수준 윈 토토에 관심을 가질 필요가 없지만 여기서는 완전성을 위해 언급했습니다.
명시적인 윈 토토을 사용하면 다음과 같은 가능성이 높아질 수 있습니다.교착상태, 두 개 이상의 트랜잭션이 각각 상대방이 원하는 윈 토토을 보유하고 있습니다. 예를 들어, 트랜잭션 1이 테이블 A에 대해 배타적 윈 토토을 획득한 다음 테이블 B에 대해 배타적 윈 토토을 획득하려고 시도하는 반면, 트랜잭션 2는 이미 테이블 B에 대해 배타적 윈 토토을 설정했고 이제 테이블 A에 대해 배타적 윈 토토을 원하는 경우 둘 다 진행할 수 없습니다.포스트그레SQL교착 상태 상황을 자동으로 감지하고 관련된 트랜잭션 중 하나를 중단하고 다른 트랜잭션이 완료되도록 허용하여 문제를 해결합니다. (정확히 어떤 트랜잭션이 중단될지는 예측하기 어려우므로 이에 의존해서는 안 됩니다.)
행 수준 윈 토토의 결과로 교착 상태가 발생할 수도 있다는 점에 유의하십시오. 따라서 명시적 윈 토토을 사용하지 않는 경우에도 교착 상태가 발생할 수 있습니다. 두 개의 동시 트랜잭션이 테이블을 수정하는 경우를 생각해 보십시오. 첫 번째 트랜잭션이 실행됩니다.
UPDATE 계정 SET 잔액 = 잔액 + 100.00 WHERE 계정 번호 = 11111;
이것은 지정된 계좌 번호를 가진 행에 행 수준 윈 토토을 획득합니다. 그런 다음 두 번째 트랜잭션이 실행됩니다.
UPDATE 계정 SET 잔액 = 잔액 + 100.00 WHERE acctnum = 22222; UPDATE 계정 SET 잔액 = 잔액 - 100.00 WHERE acctnum = 11111;
첫 번째업데이트문이 지정된 행에서 행 수준 윈 토토을 성공적으로 획득했으므로 해당 행 업데이트에 성공합니다. 그러나 두 번째업데이트문은 업데이트하려는 행이 이미 잠겨 있음을 발견하여 윈 토토을 획득한 트랜잭션이 완료될 때까지 기다립니다. 이제 트랜잭션 2는 실행을 계속하기 전에 트랜잭션 1이 완료되기를 기다리고 있습니다. 이제 트랜잭션 1이 실행됩니다.
UPDATE 계정 SET 잔액 = 잔액 - 100.00 WHERE acctnum = 22222;
트랜잭션 1은 지정된 행에서 행 수준 윈 토토을 얻으려고 시도하지만 실패합니다. 트랜잭션 2가 이미 그러한 윈 토토을 보유하고 있습니다. 따라서 트랜잭션 2가 완료될 때까지 기다립니다. 따라서 트랜잭션 1은 트랜잭션 2에서 차단되고 트랜잭션 2는 트랜잭션 1에서 차단됩니다: 교착 상태 조건입니다.PostgreSQL이 상황을 감지하고 트랜잭션 중 하나를 중단합니다.
교착 상태에 대한 최선의 방어는 일반적으로 데이터베이스를 사용하는 모든 응용 프로그램이 일관된 순서로 여러 개체에 대한 윈 토토을 획득하는지 확인하여 교착 상태를 방지하는 것입니다. 위의 예에서 두 트랜잭션이 모두 동일한 순서로 행을 업데이트했다면 교착 상태가 발생하지 않았을 것입니다. 또한 트랜잭션의 개체에 대해 획득한 첫 번째 윈 토토이 해당 개체에 필요한 가장 제한적인 모드인지 확인해야 합니다. 이를 사전에 확인할 수 없는 경우 교착 상태로 인해 중단된 트랜잭션을 다시 시도하여 교착 상태를 즉시 처리할 수 있습니다.
교착 상태 상황이 감지되지 않는 한 테이블 수준 또는 행 수준 윈 토토을 찾는 트랜잭션은 충돌하는 윈 토토이 해제될 때까지 무기한 대기합니다. 즉, 애플리케이션이 오랜 시간 동안(예: 사용자 입력을 기다리는 동안) 트랜잭션을 열어 두는 것은 좋지 않은 생각입니다.
포스트그레SQL응용 프로그램에서 정의한 의미를 갖는 윈 토토을 생성하는 수단을 제공합니다. 이것들은권고 윈 토토, 시스템이 해당 사용을 강제하지 않기 때문에 이를 올바르게 사용하는 것은 애플리케이션에 달려 있습니다. 권고 윈 토토은 MVCC 모델에 적합하지 않은 윈 토토 전략에 유용할 수 있습니다. 예를 들어, 권고 윈 토토의 일반적인 용도는 소위 말하는 비관적 윈 토토 전략을 에뮬레이트하는 것입니다.“플랫 파일”데이터 관리 시스템. 테이블에 저장된 플래그를 동일한 목적으로 사용할 수 있지만 권고 윈 토토은 더 빠르고 테이블 팽창을 방지하며 세션이 끝날 때 서버에 의해 자동으로 정리됩니다.
자문 윈 토토을 획득하는 방법에는 두 가지가 있습니다.PostgreSQL: 세션 수준 또는 트랜잭션 수준에서. 세션 수준에서 획득한 권고 윈 토토은 명시적으로 해제되거나 세션이 종료될 때까지 유지됩니다. 표준 윈 토토 요청과 달리 세션 수준 권고 윈 토토 요청은 트랜잭션 의미 체계를 따르지 않습니다. 나중에 롤백되는 트랜잭션 중에 획득한 윈 토토은 롤백 후에도 계속 유지되며 마찬가지로 호출 트랜잭션이 나중에 실패하더라도 윈 토토 해제는 유효합니다. 윈 토토은 소유 프로세스에 의해 여러 번 획득될 수 있습니다. 완료된 각 윈 토토 요청에 대해 윈 토토이 실제로 해제되기 전에 해당 윈 토토 해제 요청이 있어야 합니다. 반면, 트랜잭션 수준 윈 토토 요청은 일반 윈 토토 요청과 유사하게 동작합니다. 즉, 트랜잭션이 끝나면 자동으로 해제되며 명시적인 윈 토토 해제 작업이 없습니다. 이 동작은 권고 윈 토토을 단기적으로 사용할 때 세션 수준 동작보다 더 편리한 경우가 많습니다. 동일한 권고 윈 토토 식별자에 대한 세션 수준 및 트랜잭션 수준 윈 토토 요청은 예상된 방식으로 서로를 차단합니다. 세션이 이미 지정된 권고 윈 토토을 보유하고 있는 경우 다른 세션이 윈 토토을 기다리고 있더라도 해당 세션에 의한 추가 요청은 항상 성공합니다. 이 설명은 기존 윈 토토 유지 및 새 요청이 세션 수준인지 트랜잭션 수준인지에 관계없이 적용됩니다.
모든 자물쇠와 마찬가지로PostgreSQL, 현재 모든 세션에서 보유하고 있는 권고 윈 토토의 전체 목록은 다음에서 찾을 수 있습니다.pg_locks시스템 보기.
권고 윈 토토과 일반 윈 토토 모두 구성 변수에 의해 크기가 정의되는 공유 메모리 풀에 저장됩니다.max_locks_per_transaction그리고max_connections. 이 메모리를 소진하지 않도록 주의해야 합니다. 그렇지 않으면 서버가 윈 토토을 전혀 부여할 수 없게 됩니다. 이는 서버가 부여할 수 있는 권고 윈 토토 수에 대한 상한을 부과하며, 일반적으로 서버 구성 방식에 따라 수만에서 수십만까지입니다.
특정한 경우 권고적인 윈 토토 방법을 사용하는 경우, 특히 명시적인 순서와 관련된 쿼리에서제한절, SQL 표현식이 평가되는 순서로 인해 획득한 윈 토토을 제어하려면 주의를 기울여야 합니다. 예를 들면:
FROM foo WHERE id = 12345에서 pg_advisory_lock(id) 선택; -- 알았어 SELECT pg_advisory_lock(id) FROM foo WHERE id 12345 LIMIT 100; -- 위험해요! pg_advisory_lock(q.id) FROM 선택 ( foo에서 ID 선택 WHERE id 12345 LIMIT 100 ) q; -- 알았어
위 쿼리에서 두 번째 형식은 다음과 같은 이유로 위험합니다.제한윈 토토 기능이 실행되기 전에는 적용이 보장되지 않습니다. 이로 인해 애플리케이션이 예상하지 못한 일부 윈 토토이 획득되어 세션이 종료될 때까지 해제에 실패할 수 있습니다. 애플리케이션의 관점에서 볼 때 이러한 윈 토토은 매달려 있지만 여전히 볼 수 있습니다.pg_locks.
권고 윈 토토을 조작하기 위해 제공되는 기능은 다음에 설명되어 있습니다.섹션 9.26.10.