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

13.3. 명시 적 토토 꽁 머니

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

데이터베이스 서버, 사용pg_locks시스템보기. 자세한 정보 토토 꽁 머니 관리자 서브 시스템의 상태를 모니터링하는 경우 참조하십시오.토토 사이트 추천 : 문서 : 9.2 : 데이터베이스 활동 모니터링.

13.3.1. 테이블 레벨 토토 꽁 머니

아래 목록은 사용 가능한 토토 꽁 머니 모드와 컨텍스트가 자동으로 사용되는 컨텍스트PostgreSQL. 당신은 또한 어떤 것도 획득 할 수 있습니다 이 토토 꽁 머니은 명령으로 명시 적으로토토 꽁 머니. 이 모든 토토 꽁 머니 모드를 기억하십시오 이름에 단어가 포함되어 있어도 테이블 레벨 토토 꽁 머니입니다"행"; 토토 꽁 머니 모드의 이름 역사적입니다. 어느 정도까지 이름은 전형적인 것을 반영합니다 각 토토 꽁 머니 모드의 사용 - 그러나 의미론은 모두 동일합니다. 하나의 토토 꽁 머니 모드와 다른 토토 꽁 머니 모드의 유일한 차이점은 각 충돌하는 토토 꽁 머니 모드 세트 (참조테이블 13-2). 두 거래는 충돌의 토토 꽁 머니을 보유 할 수 없습니다 동시에 같은 테이블의 모드. (그러나 a 거래는 결코 그 자체와 충돌하지 않습니다. 예를 들어, 그럴 수도 있습니다 습득하다액세스 독점토토 꽁 머니 및 나중에 인수액세스 공유토토 꽁 머니 동일한 테이블.) 비 분화 토토 꽁 머니 모드를 유지할 수 있습니다 많은 거래에 의해 동시에. 특히 그 사실을 알아 봅니다 일부 자물쇠 모드는 자체적으로 자체적으로 사용됩니다 (예 : AN액세스 독점토토 꽁 머니을 유지할 수 없습니다 한 번에 하나 이상의 거래에 의해) 다른 사람은 그렇지 않습니다. 자체 분해 (예를 들어,액세스 공유하다토토 꽁 머니 장치는 여러 거래에 의해 유지 될 수 있습니다).

테이블 레벨 토토 꽁 머니 모드

액세스 공유

액세스 독점적인토토 꽁 머니 모드 만.

theselect명령 a 참조 테이블 에서이 모드의 토토 꽁 머니. 일반적으로 쿼리 만읽기테이블 및 그렇지 않습니다 이 토토 꽁 머니 모드를 획득하게됩니다.

행 쉐어

독점and액세스 독점토토 꽁 머니 모드.

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

Row Exclusive

공유, 공유 ROW 독점, 독점액세스 독점적인토토 꽁 머니 모드.

명령업데이트, 삭제삽입이 토토 꽁 머니 모드를 획득하십시오 대상 테이블 (외에액세스 공유하다다른 참조 테이블의 토토 꽁 머니). ~ 안에 일반적 으로이 토토 꽁 머니 모드는 모든 명령에 의해 획득됩니다. 저것수정 데이터테이블에서.

독점 업데이트 공유

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

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

공유

행 독점적인, 공유 업데이트 독점적인, 공유 행 독점적인, 독점액세스 독점토토 꽁 머니 모드. 이 모드는 동시 데이터로부터 테이블을 보호합니다 변화.

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

공유 ROW 독점

행 독점적인, 공유 업데이트 독점적인, 공유, 공유 ROW 독점, 독점액세스 독점적인토토 꽁 머니 모드. 이 모드는 테이블을 보호합니다 동시 데이터가 변경되며 자기 독점적입니다 한 번에 한 번만 보유 할 수 있습니다.

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

독점

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

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

액세스 독점

모든 모드의 토토 꽁 머니과 충돌합니다 (액세스 공유, 행 공유하다, Row Exclusive, 공유 업데이트 독점, 공유, 공유 Row 독점, 독점, 그리고액세스 독점). 이 모드 보유자가 유일한 거래임을 보장합니다 어떤 식 으로든 테이블에 액세스합니다.

획득Alter Table, 드롭 테이블, Truncate, Reindex, 클러스터, 그리고진공 Full명령. 이것 또한의 기본 토토 꽁 머니 모드입니다.토토 꽁 머니 테이블지정하지 않는 진술 명시 적으로 모드.

팁 :액세스 독점적인토토 꽁 머니 블록 Aselect(업데이트/공유) 문.

일단 인수 한 후에는 자물쇠가 일반적으로 끝까지 유지됩니다. 거래. 그러나 a SavePoint, 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
공유 ROW 독점 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.3. 교착 상태

명시 적 토토 꽁 머니을 사용하면의 가능성이 높아질 수 있습니다.교착 상태, 여기서 2 개 (또는 그 이상) 거래는 각각 다른 사람이 원하는 토토 꽁 머니을 고정합니다. 예를 들어, 트랜잭션 1이 표 A에서 독점 토토 꽁 머니을 획득 한 다음 표 B에서 독점적 인 토토 꽁 머니을 취득하려고 시도하는 동안 트랜잭션 2는 이미 독점적 인 토토 꽁 머니 테이블 B와 현재입니다 테이블 A에 독점적 인 토토 꽁 머니을 원한다면 어느 쪽도 진행하다.PostgreSQL교착 상태를 자동으로 감지하여 해결합니다 관련된 거래 중 하나를 중단하여 허용합니다 다른 완료. (정확히 어떤 거래가 될 것인지 낙태는 예측하기 어렵고 의존해서는 안됩니다. 에.)

교착 상태도 줄 수준 토토 꽁 머니 장치 (따라서 명시 적으로도 발생할 수 있습니다. 토토 꽁 머니이 사용되지 않습니다). 두 개의 동시 사례를 고려하십시오 트랜잭션은 표를 수정합니다. 첫 번째 거래 실행 :

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

이것은 지정된 상태에서 행에서로드 레벨 토토 꽁 머니을 얻습니다. 계정 번호. 그런 다음 두 번째 트랜잭션이 실행됩니다.

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

첫 번째업데이트진술 지정된 행에서 로우 레벨 토토 꽁 머니을 성공적으로 획득하므로 그 행을 업데이트하는 데 성공합니다. 그러나 두 번째업데이트명령문은 행을 발견합니다 업데이트를 시도하는 것이 이미 잠겨 있으므로 기다립니다. 완료하기 위해 토토 꽁 머니을 취득한 거래의 경우. 거래 2가 이제 거래 1을 완료하기 위해 기다리고 있습니다. 계속 실행되기 전에. 이제 거래 1 실행 :

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

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

교착 상태에 대한 최선의 방어는 일반적으로 피하는 것입니다 데이터베이스를 사용하는 모든 응용 프로그램이 일관된 순서로 여러 객체의 토토 꽁 머니 장치를 얻습니다. 에서 위의 예, 두 거래가 모두 행을 업데이트 한 경우 같은 순서, 교착 상태가 발생하지 않았을 것입니다. 하나도해야합니다 객체에서 최초의 토토 꽁 머니 장치가 트랜잭션은 필요한 가장 제한적인 모드입니다. 그 대상을 위해. 이를 확인하는 것이 불가능한 경우 사전, 교착 상태는 재 시도로 날짜를 처리 할 수 ​​있습니다 교착 상태로 인해 중단되는 거래.

교착 상태가 감지되지 않는 한 거래 테이블 레벨 또는 로우 레벨 토토 꽁 머니을 찾는 것이 기다립니다 충돌하는 자물쇠가 릴리스되기 위해 무기한. 이것은 의미합니다 애플리케이션이 거래를 개방하는 것은 나쁜 생각입니다. 장기간 (예 : 사용자 입력을 기다리는 동안).

13.3.4. 자문 토토 꽁 머니

PostgreSQL수단을 제공합니다 응용 프로그램 정의 의미가있는 토토 꽁 머니 장치를 작성합니다. 이것들은라고합니다.자문 토토 꽁 머니, 시스템이 사용을 시행하지 않기 때문에 올바르게 사용할 신청. 자문 토토 꽁 머니 장치가 유용 할 수 있습니다 MVCC에 어색한 토토 꽁 머니 전략 모델. 예를 들어, 자문 토토 꽁 머니 토토 꽁 머니 장치의 일반적인 사용은 다음과 같습니다. 소위의 전형적인 비관적 토토 꽁 머니 전략 에뮬레이션"플랫 파일"데이터 관리 시스템. 테이블에 저장된 깃발은 동일하게 사용될 수 있습니다. 목적, 자문 토토 꽁 머니 장치는 더 빠르고, 테이블 부풀어 오르고, 끝에서 서버에 의해 자동으로 정리되었습니다. 세션.

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

모든 자물쇠처럼PostgreSQL, 전체 자문 목록 현재 모든 세션에서 보유한 자물쇠는에서 찾을 수 있습니다.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.