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

13.3. 명시적 윈 토토

포스트그레SQL다양한 제공 테이블의 데이터에 대한 동시 액세스를 제어하는 윈 토토 모드입니다. 이것들 상황에 따라 애플리케이션 제어 윈 토토에 모드를 사용할 수 있습니다. 어디서MVCC제공하지 않습니다 원하는 행동. 또한 대부분의PostgreSQL명령이 자동으로 획득됩니다. 참조된 테이블이 손상되지 않도록 적절한 모드 윈 토토 명령이 실행되는 동안 호환되지 않는 방식으로 삭제되거나 수정되었습니다. 실행합니다. (예를 들어,잘라내기할 수 없습니다 동일한 작업에 대한 다른 작업과 동시에 안전하게 실행될 수 있습니다. 테이블에 대해 배타적 윈 토토을 획득하여 적용합니다. 그.)

현재 해결되지 않은 윈 토토 목록을 조사하려면 데이터베이스 서버는 다음을 사용합니다.pg_locks시스템 보기. 자세한 내용은 윈 토토 관리자 하위 시스템의 상태 모니터링은 다음을 참조하세요.롤 토토 : 문서 : 9.3 : 데이터베이스 활동 모니터링.

13.3.1. 테이블 수준 윈 토토

아래 목록은 사용 가능한 윈 토토 모드와 컨텍스트를 보여줍니다. 여기서는 자동으로 사용됩니다.PostgreSQL. 당신은 또한 다음 중 하나를 얻을 수 있습니다 다음 명령을 사용하여 명시적으로 잠급니다.PostgreSQL : 문서 : 9.3 : 롤 토토. 이러한 윈 토토 모드는 모두 테이블 수준 윈 토토이라는 점을 기억하세요. 이름에 다음 단어가 포함된 경우"행"; 는 윈 토토 모드의 이름은 역사적입니다. 어느 정도 이름이 각 윈 토토 모드의 일반적인 사용법을 반영하지만 의미는 다음과 같습니다. 모두 똑같습니다. 하나의 윈 토토 모드와 다른 윈 토토 모드 간의 유일한 실제 차이점은 다른 하나는 각각 충돌하는 윈 토토 모드 세트입니다(참조테이블 13-2). 두 트랜잭션은 충돌하는 모드의 윈 토토을 보유할 수 없습니다. 같은 테이블에서 동시에. (단, 거래는 절대로 그 자체와 충돌합니다. 예를 들어, 다음을 획득할 수 있습니다.접속 독점윈 토토 후 나중에 획득액세스 공유같은 테이블을 잠급니다.) 충돌하지 않는 윈 토토 모드는 여러 사용자가 동시에 유지할 수 있습니다. 거래. 특히 일부 윈 토토 모드는 자체 충돌(예:액세스 독점윈 토토은 둘 이상의 트랜잭션에 의해 유지될 수 없습니다. a 시간) 다른 것들은 자기 충돌을 일으키지 않는 반면(예: an액세스 공유윈 토토은 여러 사람이 보유할 수 있습니다. 거래).

테이블 수준 윈 토토 모드

액세스 공유

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

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

행 공유

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

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

행 독점

다음과의 충돌공유, 공유 행 독점, 독점액세스 독점윈 토토 모드.

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

업데이트 독점 공유

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

취득자진공(없이전체), 분석, 동시에 인덱스 생성및 일부 형태의테이블 변경.

공유

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

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

공유 행 독점

다음과의 충돌행 독점, 업데이트 독점 공유, 공유, 행 독점 공유, 독점액세스 독점윈 토토 모드. 이 모드는 테이블을 다음으로부터 보호합니다. 동시 데이터는 변경되며 자체 배타적이므로 하나만 세션은 한 번에 이를 보유할 수 있습니다.

이 윈 토토 모드는 자동으로 획득되지 않습니다.포스트그레SQL명령.

독점

다음과의 충돌행 공유, 행 독점, 공유 업데이트 독점, 공유, 행 독점 공유, 독점액세스 독점윈 토토 모드. 이 모드는 동시만 허용합니다.액세스 공유윈 토토, 즉 읽기만 가능 테이블은 이를 보유하는 트랜잭션과 병렬로 진행될 수 있습니다. 윈 토토 모드.

이 윈 토토 모드는 어떤 테이블에서도 자동으로 획득되지 않습니다.PostgreSQL명령.

접속 독점

모든 모드의 윈 토토과 충돌합니다(액세스 공유, 행 공유, 행 독점, 업데이트 공유 독점, 공유, 공유 행 독점, 독점액세스 독점). 이 모드는 보유자가 유일한 사람임을 보장합니다. 어떤 방식으로든 테이블에 액세스하는 트랜잭션입니다.

다음에 의해 획득됨테이블 변경, 드롭 테이블, 잘라내기, 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. 행 수준 윈 토토

테이블 수준 윈 토토 외에도 행 수준 윈 토토이 있습니다. 이는 배타적 윈 토토 또는 공유 윈 토토일 수 있습니다. 배타적 행 수준 윈 토토 특정 행의 행이 업데이트되면 자동으로 획득됩니다. 또는 삭제되었습니다. 트랜잭션이 커밋되거나 롤링될 때까지 윈 토토이 유지됩니다. 뒤로, 테이블 수준 윈 토토과 같습니다. 행 수준 윈 토토은 영향을 주지 않습니다. 데이터 쿼리; 그들은 단지 차단작성자를 같은 행에.

실제로 행에 대한 배타적 행 수준 윈 토토을 획득하려면 행을 수정하려면 다음을 사용하여 행을 선택하세요.선택 업데이트용. 행 수준 윈 토토이 획득되면 트랜잭션은 걱정하지 않고 행을 여러 번 업데이트할 수 있습니다. 충돌.

행에서 공유된 행 수준 윈 토토을 얻으려면 다음이 있는 행을 선택하십시오.공유 선택. 공유 윈 토토은 그렇지 않습니다. 다른 트랜잭션이 동일한 공유 윈 토토을 획득하는 것을 방지합니다. 그러나 업데이트, 삭제 또는 거래는 허용되지 않습니다. 다른 트랜잭션이 보유하고 있는 행을 독점적으로 잠급니다. 공유 윈 토토. 그렇게 하려는 시도는 공유될 때까지 차단됩니다. 윈 토토이 해제되었습니다.

포스트그레SQL아무것도 기억하지 못함 메모리의 수정된 행에 대한 정보를 제공하므로 제한이 없습니다. 한 번에 잠긴 행 수 그러나 행을 잠그는 경우 디스크 쓰기를 유발합니다. 예:선택 대상 업데이트선택한 행을 수정하여 잠긴 것으로 표시하므로 그렇게 됩니다. 결과적으로 디스크 쓰기가 발생합니다.

테이블 및 행 윈 토토 외에도 페이지 수준 공유/독점 윈 토토은 테이블 페이지에 대한 읽기/쓰기 액세스를 제어하는 데 사용됩니다. 공유 버퍼 풀. 이러한 윈 토토은 다음 직후에 해제됩니다. 행을 가져오거나 업데이트합니다. 응용프로그램 개발자는 일반적으로 그럴 필요가 없습니다. 페이지 수준 윈 토토에 관심이 있지만 여기서는 다음과 같이 언급합니다. 완전성.

13.3.3. 교착 상태

명시적 윈 토토을 사용하면 다음과 같은 가능성이 높아질 수 있습니다.교착상태, 여기서 2개(또는 그 이상) 각 트랜잭션은 상대방이 원하는 윈 토토을 보유합니다. 예를 들어, 트랜잭션 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.4. 권고 윈 토토

PostgreSQL다음을 위한 수단을 제공합니다. 애플리케이션에서 정의한 의미를 갖는 윈 토토을 생성합니다. 이들은 전화함권고 윈 토토, 시스템이 사용을 강요하지 않습니다. 사용 여부는 애플리케이션에 달려 있습니다. 올바르게. 권고 윈 토토은 윈 토토 전략에 유용할 수 있습니다. 이는 MVCC 모델에 적합하지 않습니다. 예를 들어, 일반적인 비관적 윈 토토 전략을 에뮬레이트하기 위해 권고 윈 토토을 사용합니다. 전형적인 소위"플랫 파일"데이터 관리 시스템. 테이블에 저장된 플래그를 사용할 수 있는 동안 같은 목적으로 권고 윈 토토은 더 빠르고, 테이블 팽창을 방지합니다. 그리고 작업이 끝나면 서버에 의해 자동으로 정리됩니다. 세션.

자문 윈 토토을 획득하는 방법에는 두 가지가 있습니다.PostgreSQL: 세션 수준 또는 트랜잭션에서 수준. 세션 수준에서 획득되면 권고 윈 토토이 유지됩니다. 명시적으로 해제되거나 세션이 종료될 때까지. 일반 자물쇠와는 다르게 요청, 세션 수준 권고 윈 토토 요청이 적용되지 않음 트랜잭션 의미론: 트랜잭션 중에 획득된 윈 토토입니다. 나중에 롤백된 내용은 롤백 후에도 계속 유지됩니다. 마찬가지로 호출 트랜잭션이 발생하더라도 윈 토토 해제가 효과적입니다. 나중에 실패합니다. 윈 토토은 소유함으로써 여러 번 획득될 수 있습니다. 프로세스; 완료된 각 윈 토토 요청에 대해 윈 토토이 실제로 해제되기 전에 해당 윈 토토 해제 요청을 수행합니다. 반면에 트랜잭션 수준 윈 토토 요청은 더 많이 동작합니다. 일반 윈 토토 요청과 마찬가지로 자동으로 해제됩니다. 트랜잭션이 종료되고 명시적인 윈 토토 해제 작업이 없습니다. 이 동작은 세션 수준보다 더 편리한 경우가 많습니다. 권고 윈 토토의 단기 사용에 대한 동작입니다. 세션 수준 동일한 권고 윈 토토에 대한 트랜잭션 수준 윈 토토 요청 식별자는 예상된 방식으로 서로를 차단합니다. 세션인 경우 이미 지정된 권고 윈 토토을 보유하고 있으므로 그에 따른 추가 요청이 발생합니다. 다른 세션이 윈 토토을 기다리고 있더라도 항상 성공합니다. 이 문은 기존 윈 토토 유지 여부에 관계없이 true입니다. 새 요청은 세션 수준 또는 거래 수준에 있습니다.

모든 자물쇠와 마찬가지로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.8.