PostgreSQL다양한 제공 테이블의 데이터에 대한 동시 액세스를 제어하기위한 무지개 토토 모드. 이것들 모드는 응용 프로그램 제어 무지개 토토에 사용될 수 있습니다 상황MVCC그렇지 않습니다 원하는 행동을 제공하십시오. 또한, 대부분PostgreSQL명령은 자동으로 획득합니다 참조 된 테이블이 명령을하는 동안 호환되지 않는 방식으로 삭제하거나 수정되지 않음 실행. (예를 들어,Alter Table다른 작업과 동시에 안전하게 실행할 수 없습니다 동일한 테이블이므로 테이블에서 독점 무지개 토토을 얻습니다. 그것을 시행하십시오.)
데이터베이스 서버, 사용pg_locks시스템보기. 자세한 정보 무지개 토토 관리자 서브 시스템의 상태를 모니터링하는 경우 참조하십시오.스포츠 토토 사이트 : 문서 : 8.3 : 데이터베이스 활동 모니터링.
아래 목록은 사용 가능한 무지개 토토 모드와 컨텍스트가 자동으로 사용되는 컨텍스트PostgreSQL. 당신은 또한 어떤 것도 획득 할 수 있습니다 이 무지개 토토은 명령으로 명시 적으로무지개 토토. 이 모든 무지개 토토 모드를 기억하십시오 이름에 단어가 포함되어 있어도 테이블 레벨 무지개 토토입니다"행"; 무지개 토토 모드의 이름 역사적입니다. 어느 정도까지 이름은 전형적인 것을 반영합니다 각 무지개 토토 모드의 사용 - 그러나 의미론은 모두 동일합니다. 하나의 무지개 토토 모드와 다른 무지개 토토 모드의 유일한 차이점은 각 충돌하는 무지개 토토 모드 세트 (참조테이블 13-2). . 두 거래는 충돌의 무지개 토토을 보유 할 수 없습니다 동시에 같은 테이블의 모드. (그러나 a 거래는 결코 그 자체와 충돌하지 않습니다. 예를 들어, 그럴 수도 있습니다 습득하다액세스 독점무지개 토토 및 나중에 인수액세스 공유무지개 토토 동일한 테이블.) 비 분화 무지개 토토 모드를 유지할 수 있습니다 많은 거래에 의해 동시에. 특히 그 사실을 알아 봅니다 일부 자물쇠 모드는 자체적으로 자체적으로 사용됩니다 (예 : AN액세스 독점무지개 토토을 유지할 수 없습니다 한 번에 하나 이상의 거래에 의해) 다른 사람은 그렇지 않습니다. 자체 분해 (예를 들어,액세스 공유하다무지개 토토 장치는 여러 거래에 의해 유지 될 수 있습니다).
테이블 레벨 무지개 토토 모드
액세스 독점적인무지개 토토 모드 만.
theselect명령은 a 참조 테이블 에서이 모드의 무지개 토토. 일반적으로 테이블 만 읽고 수정하지 않는 쿼리 이 무지개 토토 모드 획득.
독점and액세스 독점무지개 토토 모드.
the업데이트 선택and공유 선택명령 대상 테이블 에서이 모드의 무지개 토토을 얻습니다 ( 에 대한 추가액세스 공유무지개 토토 참조하지만 선택되지 않은 다른 테이블에서업데이트/공유 용).
공유, 공유 행 독점, 독점및액세스 독점적인무지개 토토 모드.
명령업데이트, 삭제및삽입이 무지개 토토 모드에서 대상 테이블 (외에액세스 공유하다다른 참조 테이블의 무지개 토토). ~ 안에 일반적 으로이 무지개 토토 모드는 모든 명령에 의해 획득됩니다. 테이블의 데이터를 수정합니다.
공유 업데이트 독점적인, share, 공유 행 독점, 독점및액세스 독점적인무지개 토토 모드. 이 모드는 테이블을 보호합니다 동시 스키마 변경 및진공runs.
획득진공(full),분석및생성 동시에 색인.
행 독점적인, 공유 업데이트 독점적인, 공유 행 독점적인, 독점및액세스 독점무지개 토토 모드. 이 모드는 동시 데이터로부터 테이블을 보호합니다 변화.
획득색인 생성(동시에).
행 독점적인, 공유 업데이트 독점적인, 공유, 공유 ROW 독점, 독점및액세스 독점적인무지개 토토 모드.
이 무지개 토토 모드는 자동으로 획득되지 않습니다PostgreSQL명령.
행 쉐어, Row Exclusive, 독점 업데이트 공유, 공유, 공유 행 독점적인, 독점및액세스 독점무지개 토토 모드. 이 모드는 동시 만 허용액세스 공유무지개 토토, 즉 읽기 만 읽습니다 테이블은 거래와 병렬로 진행할 수 있습니다 이 무지개 토토 모드를 유지합니다.
이 무지개 토토 모드는 사용자에서 자동으로 획득되지 않습니다 어떤 테이블PostgreSQL명령. 그러나 특정 시스템에서 획득됩니다 일부 작업에서 카탈로그.
모든 모드의 무지개 토토과 충돌합니다 (액세스 공유, 행 공유하다, Row Exclusive, 공유 업데이트 독점, 공유, 공유 Row 독점, 독점, 그리고액세스 독점). 이 모드 보유자가 유일한 거래임을 보장합니다 어떤 식 으로든 테이블에 액세스합니다.
획득Alter Table, 드롭 테이블, Truncate, Reindex, 클러스터, 그리고진공 Full명령. 이것 또한의 기본 무지개 토토 모드입니다.무지개 토토 테이블지정하지 않는 진술 명시 적으로 모드.
팁 :만액세스 독점적인무지개 토토 블록 Aselect(for 업데이트/공유) 문.
일단 인수되면, 자물쇠는 일반적으로 끝까지 유지됩니다. 거래. 그러나 a SavePoint, SavePoint가 있으면 무지개 토토이 즉시 해제됩니다. 롤백으로. 이것은 원칙과 일치합니다.롤백SavePoint 이후 명령. 획득 한 자물쇠에 대해서도 마찬가지입니다 A 내에서pl/pgsql예외 블록 : 블록 릴리스 무지개 토토 장치에서 오류 탈출 그 안에.
테이블 레벨 무지개 토토 외에도로드 레벨 무지개 토토 장치가 있으며 독점적이거나 공유 무지개 토토 장치 일 수 있습니다. 독점적 인 행 수준 특정 행의 무지개 토토은 행이 자동으로 획득됩니다. 업데이트 또는 삭제됩니다. 자물쇠는 거래까지 유지됩니다 테이블 레벨과 같은 방식으로 커밋 또는 롤백 자물쇠. 로우 레벨 무지개 토토은 데이터 쿼리에 영향을 미치지 않습니다. 그들은 차단같은 작가 열만.
실제로 행 수정,로 행을 선택하십시오.업데이트 선택. 한 번 행 수준이면 주목하십시오 무지개 토토 장치가 인수되며 트랜잭션은 행을 여러 번 업데이트 할 수 있습니다. 갈등에 대한 두려움없이 시대.
행에서 공유 행 레벨 무지개 토토을 얻으려면 행을 선택하십시오. 와 함께공유 선택. 공유 무지개 토토 다른 거래가 동일하게 인수하는 것을 막지 않습니다 공유 무지개 토토. 그러나 거래가 업데이트되지 않으며 삭제하거나 다른 행을 독점적으로 잠그십시오. 트랜잭션은 공유 무지개 토토 장치를 보유합니다. 그렇게하려는 시도 공유 무지개 토토 장치가 출시 될 때까지 차단하십시오.
postgresql기억하지 못합니다 메모리에서 수정 된 행에 대한 정보는 없습니다. 한 번에 잠긴 행 수에 대한 제한. 하지만, 행을 잠그면 디스크 쓰기가 발생할 수 있습니다. 예를 들어,업데이트 선택선택된 수정 무지개 토토을 표시하는 행, 디스크가 발생합니다. 쓰기.
테이블 및 행 무지개 토토 장치 외에 페이지 수준 공유/독점 무지개 토토 장치는 읽기/쓰기 액세스를 제어하는 데 사용됩니다 공유 버퍼 풀의 표 페이지. 이 자물쇠가 해제됩니다 행이 가져 오거나 업데이트 된 직후. 애플리케이션 개발자는 일반적으로 페이지 수준에 관심을 가질 필요가 없습니다 자물쇠이지만 우리는 완전성에 대해 언급합니다.
명시 적 무지개 토토을 사용하면의 가능성이 높아질 수 있습니다.교착 상태, 여기서 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;
거래 거래는 지정된 행, 그러나 할 수는 없습니다 : 트랜잭션은 이미 보유하고 있습니다 그런 자물쇠. 따라서 거래 2가 완료되기를 기다립니다. 따라서, 거래 1은 거래 2와 거래에 차단됩니다 트랜잭션 1에서 두 개가 차단됩니다 : 교착 상태 조건.PostgreSQL이것을 감지합니다 상황과 거래 중 하나를 중단합니다.
교착 상태에 대한 최선의 방어는 일반적으로 피하는 것입니다 데이터베이스를 사용하는 모든 응용 프로그램이 일관된 순서로 여러 객체의 무지개 토토 장치를 얻습니다. 에서 위의 예, 두 거래가 모두 행을 업데이트 한 경우 같은 순서, 교착 상태가 발생하지 않았을 것입니다. 하나도해야합니다 객체에서 최초의 무지개 토토 장치가 트랜잭션은이를 위해 필요한 최고 모드입니다. 물체. 미리 확인하는 것이 불가능하다면 교착 상태는 거래를 다시 시도하여 날짜를 처리 할 수 있습니다 교착 상태로 인해 중단됩니다.
교착 상태 상황이 감지되지 않는 한 거래 테이블 레벨 또는 로우 레벨 무지개 토토을 찾는 것이 기다립니다 충돌하는 자물쇠가 릴리스되기 위해 무기한. 이것은 의미합니다 애플리케이션이 거래를 개방하는 것은 나쁜 생각입니다. 장기간 (예 : 사용자 입력을 기다리는 동안).
PostgreSQL수단을 제공합니다 응용 프로그램 정의 의미가있는 무지개 토토 장치를 작성합니다. 이것들은라고합니다.자문 무지개 토토, 시스템이 사용을 시행하지 않기 때문에 올바르게 사용할 신청. 자문 무지개 토토 장치가 유용 할 수 있습니다 MVCC에 어색한 무지개 토토 전략 모델. 일단 인수되면, 자문 무지개 토토 장치는 명시 적으로 진행될 때까지 개최됩니다 릴리스되거나 세션이 종료됩니다. 표준 무지개 토토과 달리 권고합니다 자물쇠는 거래 시맨틱을 존중하지 않습니다 : 획득 한 자물쇠 나중에 롤백 된 거래 중에는 여전히 롤백 후에 개최되며 마찬가지로 무지개 토토 해제도 마찬가지입니다 호출 트랜잭션이 나중에 실패하더라도 효과적입니다. 동일합니다 무지개 토토은 소유 프로세스에 의해 여러 번 획득 할 수 있습니다. 각 무지개 토토 요청에는 해당 무지개 토토 해제 요청이 있어야합니다. 무지개 토토이 실제로 해제되기 전에. (이미 세션 인 경우 주어진 무지개 토토 장치를 보유하고 있으며 추가 요청은 항상 성공합니다. 다른 세션이 무지개 토토을 기다리고있는 경우에도.) 모든 자물쇠와 마찬가지로 안에PostgreSQL, 전체 목록 현재 모든 세션에서 보유하고있는 자문 무지개 토토 장치 그만큼pg_locks시스템보기
자문 무지개 토토 장치는 공유 메모리 풀에서 할당됩니다. 구성 변수로 정의 된 크기max_locks_per_transaction및max_connections. 이 메모리 나 서버를 소진시키지 않도록주의해야합니다. 자물쇠를 전혀 부여 할 수 없습니다. 이것은 부과합니다 upper limit on the number of advisory locks grantable by the 서버, 일반적으로 수십만에서 수십만 안에 있습니다 서버 구성 방식에 따라
자문 자문의 일반적인 사용은 비관적 인을 모방하는 것입니다. 소위 전형적인 무지개 토토 전략"플랫 파일"데이터 관리 시스템. a 테이블에 저장된 깃발은 같은 목적으로 사용될 수 있습니다. 자문 무지개 토토 장치는 더 빠르고 MVCC 부풀어 오르지 않으며, 그렇지 않습니다 끝에서 서버에 의해 자동으로 정리되었습니다. 세션. 어떤 경우에는이 방법을 사용하는 경우, 특히 명시 적 순서 및 관련 쿼리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-56.