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

13.3. 명시 적 윈 토토

postgresql다양한 제공 테이블의 데이터에 대한 동시 액세스를 제어하기위한 윈 토토 모드. 이것들 모드는 상황에서 응용 프로그램 제어 윈 토토에 사용할 수 있습니다 어디MVCC원하는 행동. 또한, 대부분PostgreSQL명령은 자동으로 획득합니다 참조 된 테이블이 아닌지 확인하기 위해 적절한 모드의 윈 토토 명령 중에 호환되지 않는 방식으로 삭제하거나 수정했습니다 실행. (예를 들어,Truncate할 수 없습니다 다른 작업과 동시에 안전하게 실행됩니다. 테이블, 그래서 그것은 시행 할 테이블의 독점 윈 토토을 얻습니다. 저것.)

데이터베이스 서버, 사용pg_locks시스템보기. 자세한 내용은 윈 토토 관리자 서브 시스템의 상태 모니터링 참조롤 토토 : 문서 : 9.3 : 데이터베이스 활동 모니터링.

13.3.1. 테이블 레벨 윈 토토

아래 목록은 사용 가능한 윈 토토 모드와 컨텍스트를 보여줍니다. 그것들은에 의해 자동으로 사용됩니다.PostgreSQL. 이 중 하나를 얻을 수도 있습니다 명령으로 명시 적으로 윈 토토PostgreSQL : 문서 : 9.3 : 롤 토토. 이 모든 윈 토토 모드는 테이블 레벨 윈 토토 장치라는 것을 기억하십시오. 이름에 단어가 포함 된 경우"행"; 그만큼 윈 토토 모드의 이름은 역사적입니다. 어느 정도까지 이름이 어느 정도입니다 각 윈 토토 모드의 일반적인 사용법을 반영하지만 의미론은 다음과 같습니다. 더 같은. 하나의 윈 토토 모드와의 유일한 차이점 다른 하나는 각 충돌이있는 윈 토토 모드 세트입니다 (참조테이블 13-2). 두 개의 거래는 충돌 모드의 윈 토토을 보유 할 수 없습니다 동시에 같은 테이블에. (그러나 거래는 결코 없습니다 그 자체와 충돌합니다. 예를 들어, 획득 할 수 있습니다액세스 독점윈 토토 및 나중에 획득액세스 공유같은 테이블을 잠그십시오.) 비 분쇄 윈 토토 모드는 많은 사람들이 동시에 보관할 수 있습니다 업무. 특히 일부 윈 토토 모드가 있습니다 자체 분해 (예를 들어,액세스 독점적인윈 토토은 둘 이상의 트랜잭션으로 보류 할 수 없습니다. 시간) 다른 사람들은 자기 분광이 아니지만 (예를 들어,액세스 공유윈 토토은 다중만으로 유지할 수 있습니다 업무).

테이블 레벨 윈 토토 모드

액세스 공유

액세스 독점윈 토토 모드 만.

theselect명령은 윈 토토을 얻습니다 참조 테이블 의이 모드. 일반적으로 모든 쿼리 만읽기테이블과 수행 수정하지 않으면이 윈 토토 모드를 얻습니다.

행 쉐어

독점and액세스 독점윈 토토 모드.

the업데이트 선택and공유 선택명령은 이것의 윈 토토을 얻습니다 대상 테이블의 모드 (액세스 공유다른 테이블의 윈 토토 참조하지만 선택되지 않음업데이트/용 공유하다).

Row Exclusive

공유, 공유 ROW 독점, 독점액세스 독점적인윈 토토 모드.

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

공유 업데이트 독점

공유 업데이트 독점적인, 공유, 공유 ROW 독점, 독점액세스 독점적인윈 토토 모드. 이 모드는 테이블을 보호합니다 동시 스키마 변경 및진공runs.

획득진공(full),분석, 동시에 색인 생성및 일부 형태의Alter Table.

공유

Row Exclusive, 공유 업데이트 독점, 공유 ROW 독점, 독점액세스 독점적인윈 토토 모드. 이 모드는 테이블을 보호합니다 동시 데이터 변경.

획득색인 생성(동시에).

공유 행 독점

Row Exclusive, 공유 업데이트 독점, 공유, 공유 ROW 독점, 독점액세스 독점적인윈 토토 모드. 이 모드는 테이블을 보호합니다 동시 데이터가 변경되며 자체 독점적이므로 세션은 한 번에 보관할 수 있습니다.

이 윈 토토 모드는 자동으로 획득되지 않습니다PostgreSQL명령.

독점

행 공유, Row Exclusive, 공유 독점 업데이트, 공유, 공유 ROW 독점, 독점액세스 독점적인윈 토토 모드. 이 모드는 동시 만 허용액세스 공유윈 토토, 즉 읽기 만 읽습니다 테이블은 이것을 보유한 거래와 병렬로 진행할 수 있습니다. 윈 토토 모드.

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

액세스 독점

모든 모드의 윈 토토과 충돌합니다 (액세스 공유하다, Row Share, Row Exclusive, 공유 업데이트 독점적인, 공유, 공유 행 독점, 독점액세스 독점적인). 이 모드는 홀더가 유일한 것임을 보장합니다 어떤 식 으로든 테이블에 액세스하는 거래.

인수Alter Table, 드롭 테이블, Truncate, Reindex, 클러스터, 진공 FullRefresh Resisized View(동시에) 명령. 이것은 또한 기본 윈 토토 장치입니다 모드윈 토토 테이블그렇지 않은 진술 모드를 명시 적으로 지정합니다.

팁 :액세스 독점윈 토토 블록 Aselect(17999_18017) 문.

일단 인수되면, 자물쇠는 일반적으로 거래 종료 될 때까지 유지됩니다. 그러나 SavePoint를 설정 한 후 윈 토토 장치가 획득되면 윈 토토 SavePoint가 다시 롤백되면 즉시 릴리스됩니다. 이것은 원칙과 일치롤백이후 명령의 모든 효과를 취소합니다 저장 포인트. A 내에서 획득 한 자물쇠에 대해서도 마찬가지입니다.pl/pgsql예외 블록 : 오류 블록에서 탈출 한 릴리스 내부에서 획득 한 윈 토토 장치.

표 13-2. 충돌 윈 토토 모드

요청 된 윈 토토 모드 현재 윈 토토 모드
액세스 공유 행 공유 Row Exclusive 공유 업데이트 독점 공유 공유 행 독점 독점 액세스 독점
액세스 공유 x
행 쉐어 x x
Row Exclusive 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. 로우 레벨 윈 토토

테이블 레벨 윈 토토 외에도로드 레벨 윈 토토 장치가 있으며 독점적이거나 공유 윈 토토 장치 일 수 있습니다. 독점적 인 행 수준 윈 토토 특정 행에서 행이 업데이트 될 때 자동으로 획득됩니다. 또는 삭제되었습니다. 트랜잭션이 저주 받거나 롤링 될 때까지 자물쇠가 유지됩니다. 뒤로, 테이블 레벨 윈 토토 장치처럼. 줄 수준의 윈 토토은 영향을 미치지 않습니다 데이터 쿼리; 그들은 만 차단같은 행으로 작가.

실제로없이 행에서 독점로드 레벨 윈 토토을 획득하려면 행 수정,로 행을 선택하십시오.선택 update. 로드 레벨 윈 토토이 획득되면 거래는 두려움없이 행을 여러 번 업데이트 할 수 있습니다. 갈등.

행에서 공유 행 레벨 윈 토토을 얻으려면로 행을 선택하십시오.공유 선택. 공유 윈 토토 장치는 그렇지 않습니다 다른 거래가 동일한 공유 윈 토토을 취득하는 것을 방지합니다. 그러나 거래, 삭제 또는 또는 거래 할 수있는 트랜잭션은 없습니다 다른 거래가 공유 윈 토토. 그렇게하려는 시도는 공유 될 때까지 차단됩니다. 윈 토토 장치가 출시되었습니다.

PostgreSQL기억하지 못합니다 메모리에서 수정 된 행에 대한 정보이므로 제한이 없습니다. 한 번에 잠긴 행의 수. 그러나 행을 잠그는 것은 가능합니다 디스크 작성 원인 (예 :선택을 선택하십시오 업데이트선택한 행을 고정시키기 위해 수정하십시오. 디스크가 쓴 결과.

테이블 및 행 윈 토토 외에도 페이지 수준의 공유/독점 윈 토토은 공유 버퍼 풀. 이 자물쇠는 A 직후에 방출됩니다 행이 가져 오거나 업데이트됩니다. 응용 프로그램 개발자는 일반적으로 필요하지 않습니다 페이지 수준의 윈 토토에 관심이 있지만 여기에서 언급되어 있습니다. 완전성.

13.3.3. 교착 상태

명시 적 윈 토토을 사용하면의 가능성이 높아질 수 있습니다.교착 상태, 여기서 2 개 (또는 그 이상) 거래는 각각 다른 사람이 원하는 윈 토토을 고정합니다. 예를 들어, if 트랜잭션 1은 표 A에서 독점 윈 토토을 인수 한 다음 시도합니다. Transaction 2가 이미 독점적으로 윈 토토 테이블 B이며 이제 독점적 인 윈 토토을 원합니다. 표 a, 어느 쪽도 진행할 수 없습니다.PostgreSQL교착 상태를 자동으로 감지합니다 거래 중 하나를 중단하여 상황을 해결합니다. 다른 사람이 완료하도록 허용합니다. (정확히 어느 거래가 중단 될 것입니다. 예측하기 어렵고 의존해야합니다.)

교착 상태는로드 레벨의 결과로도 발생할 수 있습니다. 자물쇠 (따라서 명시 적 윈 토토이 아닌 경우에도 발생할 수 있습니다. 사용된). 두 개의 동시 거래가있는 경우를 고려하십시오 테이블을 수정하십시오. 첫 번째 트랜잭션이 실행됩니다.

업데이트 계정 세트 밸런스 = 밸런스 + 100.00 여기서 acctnum = 11111;

이것은 지정된 상태에서 행의 행 수준 윈 토토을 얻습니다. 계정 번호. 그런 다음 두 번째 트랜잭션이 실행됩니다.

업데이트 계정 설정 밸런스 = 밸런스 + 100.00 여기서 acctnum = 22222;
계정 업데이트 설정 밸런스 = 밸런스 -100.00 여기서 acctnum = 11111;

첫 번째업데이트성명서가 성공적으로 나타납니다 지정된 행에서 로우 레벨 윈 토토을 얻으므로 성공합니다. 그 행을 업데이트합니다. 그러나 두 번째업데이트진술은 그것이 시도중인 행을 발견합니다 업데이트하려면 이미 잠긴 상태이므로 거래를 기다립니다. 그것은 완료하기 위해 자물쇠를 얻었습니다. 거래 2가 이제 기다리고 있습니다 트랜잭션에서 계속 실행되기 전에 완료해야합니다. 지금, 트랜잭션 하나는 실행됩니다 :

업데이트 계정 설정 밸런스 = 밸런스 -100.00 여기서 acctnum = 22222;

거래 트랜잭션 1에 대한로드 레벨 윈 토토을 얻으려고 시도합니다. 지정된 행, 그러나 할 수는 없습니다 : 거래 2는 이미 그러한 잠그다. 따라서 거래 2가 완료되기를 기다립니다. 따라서, 거래 1은 거래 2에서 차단되고 거래 2 트랜잭션 1에서 차단됩니다 : 교착 상태 조건PostgreSQL이 상황을 감지합니다 거래 중 하나를 중단합니다.

교착 상태에 대한 최선의 방어는 일반적으로 그것들을 피하는 것입니다. 데이터베이스를 사용하는 모든 응용 프로그램이 윈 토토을 획득한다고 확신합니다. 일관된 순서로 여러 객체에서. 위의 예에서 if 두 거래 모두 동일한 순서로 행을 업데이트했습니다. 교착 상태가 발생했을 것입니다. 또한 첫 번째를 보장해야합니다 트랜잭션에서 개체에서 획득 한 윈 토토은 가장 제한적입니다. 해당 객체에 필요한 모드. 가능하지 않은 경우 이것을 미리 확인하면 교착 상태는 교착 상태로 인해 중단되는 거래를 다시 시도합니다.

교착 상태 상황이 감지되지 않는 한 거래 테이블 레벨 또는 로우 레벨 윈 토토을 찾는 것이 기다립니다 충돌하는 자물쇠가 릴리스되기 위해 무기한. 이것은 그것이 의미합니다 애플리케이션이 트랜잭션을 오랫동안 열어 두는 나쁜 생각 기간 (예 : 사용자 입력을 기다리는 동안).

13.3.4. 자문 윈 토토

PostgreSQL응용 프로그램 정의 의미가있는 윈 토토 장치를 만듭니다. 이것들입니다 라고 불리는자문 윈 토토, 시스템이기 때문에 사용을 시행하지 않습니다. 사용하는 것은 응용 프로그램에 달려 있습니다. 올바르게. 자문 윈 토토은 윈 토토 전략에 유용 할 수 있습니다 그것은 MVCC 모델에 어색한 것입니다. 예를 들어, 공통 자문 윈 토토 장치 사용은 비관적 윈 토토 전략을 모방하는 것입니다. 소위 전형적인"플랫 파일"데이터 관리 시스템. 테이블에 저장된 깃발을 사용할 수 있지만 같은 목적으로 자문 윈 토토 장치가 더 빠르고 테이블 부풀어 오르십시오. 그리고 끝에서 서버에 의해 자동으로 청소됩니다. 세션.

자문 윈 토토 장치를 얻는 방법에는 두 가지가 있습니다PostgreSQL: 세션 수준 또는 트랜잭션에서 수준. 세션 수준에서 인수하면 자문 윈 토토 장치가 개최됩니다. 명시 적으로 릴리스되거나 세션이 종료 될 때까지. 표준 윈 토토과 달리 요청, 세션 수준의 자문 윈 토토 요청은 존중하지 않습니다 거래 시맨틱 : 거래 중에 획득 한 자물쇠 나중에 롤백 후에도 롤백이 계속되고 있습니다. 마찬가지로 호출 트랜잭션이 있어도 윈 토토 해제가 효과적입니다. 나중에 실패합니다. 자물쇠는 소유로 여러 번 획득 할 수 있습니다. 프로세스; 완성 된 각 윈 토토 요청에 대해 a가 있어야합니다 윈 토토이 실제로 해제되기 전에 해당 윈 토토 해제 요청. 반면에 거래 수준의 윈 토토 요청은 더 많이 행동합니다 일반 윈 토토 요청과 마찬가지로 : 자동으로 릴리스됩니다. 거래 종료 및 명시 적 윈 토토 해제 작업은 없습니다. 이 동작은 종종 세션 수준보다 편리합니다 자문 윈 토토의 단기 사용을위한 행동. 세션 수준 동일한 자문 윈 토토에 대한 거래 수준 윈 토토 요청 식별자는 예상되는 방식으로 서로를 차단합니다. 세션 인 경우 이미 주어진 자문 윈 토토 장치를 보유하고 있으며 추가 요청은 다른 세션이 자물쇠를 기다리고 있어도 항상 성공합니다. 이것 기존 윈 토토 장치가 있고 새로운 요청은 세션 수준 또는 거래 수준입니다.

모든 자물쇠처럼PostgreSQL, a 현재 모든 세션에서 보유하고있는 자문 윈 토토의 전체 목록은 에서 찾을 수 있습니다.PG_LOCKS시스템보기

자문 윈 토토 및 일반 윈 토토 장치는 공유에 저장됩니다. 구성 변수에 의해 크기가 정의 된 메모리 풀max_locks_per_transactionmax_connections. 이 메모리를 소진시키지 않도록주의를 기울여야합니다. 그렇지 않으면 서버가 자물쇠를 전혀 부여 할 수 없습니다. 이것은 상한을 부과합니다 서버가 부여 할 수있는 자문 윈 토토 수는 일반적으로 서버의 방식에 따라 수십 ~ 수십만 구성.

어떤 경우에는 자문 윈 토토 방법, 특히 명시 적 순서 및 관련 쿼리Limit조항, 조절을 위해주의를 기울여야합니다 SQL 표현이있는 순서로 인해 획득 한 자물쇠 평가. 예를 들어:

foo에서 pg_advisory_lock (id)을 선택하여 id = 12345; -- 좋아요
foo에서 pg_advisory_lock (id)을 선택하십시오. - 위험!
pg_advisory_lock (q.id)을 선택하십시오
(
  id 12345 Limit 100의 Foo에서 ID를 선택하십시오.
) Q; -- 좋아요

위의 쿼리에서 두 번째 양식은 위험하기 때문에Limit는 적용되지 않습니다 윈 토토 기능이 실행되기 전에. 이것은 일부를 유발할 수 있습니다 응용 프로그램이 기대하지 않았다는 자물쇠를 획득하고 따라서 릴리스되지 않습니다 (세션이 끝날 때까지). 에서 응용 프로그램의 관점, 그러한 자물쇠는 매달려있을 것입니다. 여전히 볼 수 있지만PG_LOCKS.

자문 윈 토토을 조작하기 위해 제공된 기능은 다음과 같습니다 설명섹션 9.26.8.