이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 13.3. 명시 적 토토 사이트 추천버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

13.3. 명시적 사설 토토

포스트그레SQL테이블의 데이터에 대한 동시 액세스를 제어하는 다양한 사설 토토 모드를 제공합니다. 이러한 모드는 다음과 같은 상황에서 애플리케이션 제어 사설 토토에 사용될 수 있습니다.MVCC원하는 동작을 제공하지 않습니다. 또한 대부분의포스트그레SQL명령은 명령이 실행되는 동안 참조된 테이블이 호환되지 않는 방식으로 삭제되거나 수정되지 않도록 자동으로 적절한 모드의 사설 토토을 획득합니다. (예를 들어,잘라내기동일한 테이블의 다른 작업과 동시에 안전하게 실행할 수 없으므로접속 독점이를 적용하려면 테이블을 잠그세요.)

데이터베이스 서버에서 현재 해결되지 않은 사설 토토 목록을 검사하려면 다음을 사용하십시오.pg_locks시스템 보기. 사설 토토 관리자 하위 시스템의 상태 모니터링에 대한 자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 11 : 28 장. 데이터베이스 활동 토토 베이.

13.3.1. 테이블 수준 사설 토토

아래 목록은 사용 가능한 사설 토토 모드와 자동으로 사용되는 컨텍스트를 보여줍니다.PostgreSQL. 다음 명령을 사용하여 이러한 사설 토토을 명시적으로 획득할 수도 있습니다.사설 토토. 이름에라는 단어가 포함되어 있더라도 이러한 사설 토토 모드는 모두 테이블 수준 사설 토토이라는 점을 기억하세요.; 사설 토토 모드의 이름은 역사적입니다. 어느 정도 이름은 각 사설 토토 모드의 일반적인 사용법을 반영하지만 의미는 모두 동일합니다. 하나의 사설 토토 모드와 다른 사설 토토 모드 사이의 유일한 실제 차이점은 각 사설 토토 모드가 충돌하는 사설 토토 모드 세트입니다(참조표 13.2). 두 트랜잭션은 동시에 동일한 테이블에서 충돌하는 모드의 사설 토토을 보유할 수 없습니다. (그러나 트랜잭션은 결코 자체적으로 충돌하지 않습니다. 예를 들어 다음을 획득할 수 있습니다.접속 독점사설 토토 후 나중에 획득액세스 공유같은 테이블에 대한 사설 토토.) 충돌하지 않는 사설 토토 모드는 많은 트랜잭션에 의해 동시에 유지될 수 있습니다. 특히 일부 사설 토토 모드는 자체 충돌을 일으킵니다(예:접속 독점한 번에 두 개 이상의 트랜잭션이 사설 토토을 보유할 수 없음) 다른 트랜잭션은 자체 충돌을 일으키지 않습니다(예:액세스 공유사설 토토은 여러 트랜잭션에 의해 유지될 수 있습니다).

테이블 수준 사설 토토 모드

액세스 공유 (액세스공유사설 토토)

다음과의 충돌접속 독점사설 토토 모드 전용.

선택명령은 참조된 테이블에서 이 모드의 사설 토토을 획득합니다. 일반적으로 다음과 같은 모든 쿼리는읽기테이블을 수정하지 않으면 이 사설 토토 모드가 획득됩니다.

행 공유 (RowShareLock)

다음과의 충돌독점그리고접속 독점사설 토토 모드.

업데이트를 위해 선택그리고공유 선택명령은 대상 테이블에서 이 모드의 사설 토토을 획득합니다(추가로액세스 공유참조되었지만 선택되지 않은 다른 테이블에 대한 사설 토토업데이트용/공유용).

행 독점 (RowExclusiveLock)

다음과의 충돌공유, 공유 행 독점, 독점접속 독점사설 토토 모드.

명령어업데이트, 삭제삽입대상 테이블에서 이 사설 토토 모드를 획득합니다(추가로액세스 공유다른 참조 테이블에 대한 사설 토토). 일반적으로 이 사설 토토 모드는 다음 명령에 의해 획득됩니다.데이터 수정테이블에.

업데이트 독점 공유 (ShareUpdateExclusiveLock)

다음과의 충돌업데이트 독점 공유, 공유, 공유 행 독점, 독점접속 독점사설 토토 모드. 이 모드는 동시 스키마 변경으로부터 테이블을 보호합니다.진공실행됩니다.

취득자진공(없음전체), 분석, 동시에 인덱스 생성, 통계 생성, 댓글 켜기그리고테이블 유효성 검사 변경및 기타테이블 변경변종(자세한 내용은 참조테이블 변경).

공유 (공유 사설 토토)

다음과의 충돌행 독점, 업데이트 독점 공유, 행 독점 공유, 독점접속 독점사설 토토 모드. 이 모드는 동시 데이터 변경으로부터 테이블을 보호합니다.

취득자색인 생성(없음동시).

행 독점 공유 (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

13.3.2. 행 수준 사설 토토

테이블 수준 사설 토토 외에도 행 수준 사설 토토이 있으며 아래에 자동으로 사용되는 컨텍스트와 함께 나열되어 있습니다.PostgreSQL. 참조표 13.3행 수준 사설 토토 충돌에 대한 전체 표를 확인하세요. 트랜잭션은 다른 하위 트랜잭션에서도 동일한 행에 충돌하는 사설 토토을 보유할 수 있습니다. 그러나 그 외에는 두 트랜잭션이 동일한 행에서 충돌하는 사설 토토을 유지할 수 없습니다. 행 수준 사설 토토은 데이터 쿼리에 영향을 주지 않습니다. 그들은 단지 차단작가 및 사물함같은 행에. 행 수준 사설 토토은 테이블 수준 사설 토토과 마찬가지로 트랜잭션 종료 시 또는 저장점 롤백 중에 해제됩니다.

행 수준 사설 토토 모드

업데이트용

업데이트용다음에 의해 검색된 행이 발생합니다.선택문은 업데이트를 위한 것처럼 잠깁니다. 이는 현재 트랜잭션이 종료될 때까지 다른 트랜잭션에 의해 잠기거나 수정되거나 삭제되는 것을 방지합니다. 즉, 시도하는 다른 거래입니다.업데이트, 삭제, 업데이트를 위해 선택, 키 업데이트 없음 선택, 공유 선택또는키 공유 선택이 행 중 현재 트랜잭션이 끝날 때까지 차단됩니다. 반대로,업데이트를 위해 선택동일한 행에서 해당 명령을 실행하는 동시 트랜잭션을 기다린 다음 업데이트된 행(또는 행이 삭제된 경우 행 없음)을 잠그고 반환합니다. a 이내반복 가능한 읽기또는직렬화 가능그러나 트랜잭션이 시작된 이후 잠길 행이 변경되면 오류가 발생합니다. 자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 11 : 13.4. 응용 프로그램 수준에서의 사설 토토 사이트 일관성 검사.

업데이트용사설 토토 모드는 누구에 의해서도 획득됩니다.삭제행으로, 그리고 또한업데이트특정 열의 값을 수정합니다. 현재 고려되는 열 세트는업데이트사례는 외래 키에 사용할 수 있는 고유 인덱스가 있는 경우입니다(따라서 부분 인덱스 및 표현식 인덱스는 고려되지 않음). 이는 향후 변경될 수 있습니다.

키 업데이트가 없는 경우

다음과 유사하게 동작함업데이트용, 획득한 사설 토토이 더 약한 것을 제외하고: 이 사설 토토은 차단되지 않습니다.키 공유 선택동일한 행에 대한 사설 토토 획득을 시도하는 명령입니다. 이 사설 토토 모드는 어떤 경우에도 획득됩니다.업데이트a를 얻지 못하는업데이트용사설 토토.

공유용

다음과 유사하게 동작함키 업데이트가 없는 경우, 단, 검색된 각 행에 대해 배타적 사설 토토이 아닌 공유 사설 토토을 획득한다는 점은 제외됩니다. 공유 사설 토토은 다른 트랜잭션이 수행되는 것을 차단합니다.업데이트, 삭제, 업데이트를 위해 선택또는키 업데이트 없음 선택이 행에 있지만 실행을 방해하지는 않습니다.공유 선택또는키 공유 선택.

키 공유용

다음과 유사하게 작동합니다공유용, 사설 토토이 더 약한 점만 제외:업데이트를 위해 선택차단되었지만 차단되지는 않음키 업데이트 없음 선택. 키 공유 사설 토토은 다른 트랜잭션이 수행되는 것을 차단합니다.삭제또는 임의의 것업데이트키 값을 변경하지만 다른 것은 변경하지 않음업데이트, 그리고 예방하지도 않습니다키 업데이트 없음 선택, 공유 선택또는키 공유 선택.

포스트그레SQL메모리의 수정된 행에 대한 정보를 기억하지 않으므로 한 번에 잠기는 행 수에는 제한이 없습니다. 그러나 행을 잠그면 디스크 쓰기가 발생할 수 있습니다. 예:업데이트를 위해 선택선택한 행을 수정하여 잠긴 것으로 표시하므로 디스크 쓰기가 발생합니다.

표 13.3. 행 수준 사설 토토 충돌

요청된 사설 토토 모드 현재 사설 토토 모드
키 공유용 공유용 키 업데이트가 없는 경우 업데이트용
키 공유용 X
공유용 X X
키 업데이트가 없는 경우 X X X
업데이트용 X X X X

13.3.3. 페이지 수준 사설 토토

테이블 및 행 사설 토토 외에도 페이지 수준 공유/독점 사설 토토은 공유 버퍼 풀의 테이블 페이지에 대한 읽기/쓰기 액세스를 제어하는 데 사용됩니다. 이러한 사설 토토은 행을 가져오거나 업데이트한 직후에 해제됩니다. 애플리케이션 개발자는 일반적으로 페이지 수준 사설 토토에 관심을 가질 필요가 없지만 여기서는 완전성을 위해 언급했습니다.

13.3.4. 교착 상태

명시적 사설 토토을 사용하면 다음 가능성이 높아질 수 있습니다.교착상태, 여기서 두 개 이상의 트랜잭션은 각각 상대방이 원하는 사설 토토을 보유합니다. 예를 들어, 트랜잭션 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이 상황을 감지하고 거래 중 하나를 중단합니다.

교착 상태에 대한 최선의 방어는 일반적으로 데이터베이스를 사용하는 모든 응용 프로그램이 일관된 순서로 여러 개체에 대한 사설 토토을 획득하는지 확인하여 교착 상태를 방지하는 것입니다. 위의 예에서 두 트랜잭션이 모두 동일한 순서로 행을 업데이트했다면 교착 상태가 발생하지 않았을 것입니다. 또한 트랜잭션의 개체에 대해 획득한 첫 번째 사설 토토이 해당 개체에 필요한 가장 제한적인 모드인지 확인해야 합니다. 이를 사전에 확인할 수 없는 경우 교착 상태로 인해 중단된 트랜잭션을 다시 시도하여 교착 상태를 즉시 처리할 수 있습니다.

교착 상태 상황이 감지되지 않는 한 테이블 수준 또는 행 수준 사설 토토을 찾는 트랜잭션은 충돌하는 사설 토토이 해제될 때까지 무기한 대기합니다. 즉, 애플리케이션이 오랜 시간 동안(예: 사용자 입력을 기다리는 동안) 트랜잭션을 열어 두는 것은 좋지 않은 생각입니다.

13.3.5. 권고 사설 토토

포스트그레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.