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

12.3. 명시 적 젠 토토

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

데이터베이스 서버, 사용pg_locks시스템보기 (섹션 42.37). 을 위한 젠 토토 관리자 상태 모니터링에 대한 자세한 내용 서브 시스템, 참조PostgreSQL : 문서 : 8.1 : 토토 캔 활동 토토 캔.

12.3.1. 테이블 레벨 젠 토토

아래 목록은 사용 가능한 젠 토토 모드와 컨텍스트가 자동으로 사용되는 컨텍스트PostgreSQL. 당신은 또한 어떤 것도 획득 할 수 있습니다 이 젠 토토은 명령으로 명시 적으로젠 토토. 이 모든 젠 토토 모드를 기억하십시오 이름에 단어가 포함되어 있어도 테이블 레벨 젠 토토입니다"행"; 젠 토토 모드의 이름 역사적입니다. 어느 정도까지 이름은 전형적인 것을 반영합니다 각 젠 토토 모드의 사용 - 그러나 의미론은 모두 동일합니다. 하나의 젠 토토 모드와 다른 젠 토토 모드의 유일한 차이점은 각 충돌하는 젠 토토 모드 세트. 둘 트랜잭션은 상충되는 모드의 젠 토토을 동일하게 유지할 수 없습니다. 동시에 테이블. (그러나 거래는 결코 상충되지 않습니다 그 자체로. 예를 들어, 획득 할 수 있습니다액세스 독점젠 토토 및 나중에 인수액세스 공유같은 테이블을 잠그십시오.) 비 분쇄 젠 토토 모드는 많은 사람들에 의해 동시에 보관 될 수 있습니다 업무. 특히 일부 젠 토토 모드가 있습니다 자체 분해 (예를 들어,액세스 독점적인젠 토토은 둘 이상의 트랜잭션으로 유지할 수 없습니다 한 번에) 다른 사람들은 자기 분류가 아니지만 (예를 들어,액세스 공유젠 토토을 잡을 수 있습니다 다중 거래). 일단 인수되면 젠 토토이 끝날 때까지 고정됩니다 거래의.

테이블 레벨 젠 토토 모드

액세스 공유

액세스 독점적인젠 토토 모드 만.

명령selectand분석이것의 젠 토토을 얻습니다 참조 테이블의 모드. 일반적으로 모든 쿼리 테이블 만 읽고 수정하지 않습니다. 이 젠 토토 모드.

Row Share

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

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

Row Exclusive

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

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

독점 업데이트 공유

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

획득진공(full).

공유

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

획득색인 생성.

공유 ROW 독점

행 독점적인, 공유 업데이트 독점적인, 공유, 공유 ROW 독점, 독점액세스 독점적인젠 토토 모드.

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

독점

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

이 젠 토토 모드는 사용자에서 자동으로 획득되지 않습니다 어떤 테이블PostgreSQL명령. 그러나 특정 시스템에서 획득됩니다 일부 작업에서 카탈로그.

액세스 독점

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

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

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

12.3.2. 로우 레벨 젠 토토

테이블 레벨 젠 토토 외에도로드 레벨 젠 토토 장치가 있으며 독점적이거나 공유 젠 토토 장치 일 수 있습니다. 독점적 인 행 수준 특정 행의 젠 토토은 행이 자동으로 획득됩니다. 업데이트 또는 삭제됩니다. 자물쇠는 거래까지 유지됩니다 커밋하거나 롤백합니다. 로우 레벨 젠 토토은 데이터에 영향을 미치지 않습니다 쿼리; 그들은 차단작가 같은 행으로만.

실제로 행 수정,로 행을 선택하십시오.업데이트 선택. 한 번 행 수준이면 주목하십시오 젠 토토 장치가 취득되면 거래는 행을 다중 업데이트 할 수 있습니다. 갈등에 대한 두려움없이 시대.

행에 공유 행 레벨 젠 토토을 얻으려면 행을 선택하십시오. 와 함께공유 선택. 공유 젠 토토 다른 거래가 동일하게 인수하는 것을 막지 않습니다 공유 젠 토토. 그러나 거래가 업데이트되지 않으며 삭제하거나 다른 행을 독점적으로 잠그십시오. 트랜잭션은 공유 젠 토토 장치를 보유합니다. 그렇게하려는 시도 공유 젠 토토 장치가 릴리스 될 때까지 차단하십시오.

PostgreSQL기억하지 못합니다 메모리에서 수정 된 행에 대한 정보는 없습니다. 한 번에 잠긴 행 수에 대한 제한. 하지만, 행을 잠그면 디스크 쓰기가 발생할 수 있습니다. 예를 들어,업데이트 선택선택된 수정 젠 토토을 표시하는 행, 디스크가 발생합니다. 쓰기.

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

12.3.3. 교착 상태

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

교착 상태도 줄 수준 젠 토토 장치 (따라서 명시 적으로도 발생할 수 있습니다. 젠 토토이 사용되지 않습니다). 두 가지가있는 경우를 고려하십시오 동시 트랜잭션 테이블 수정. 첫 번째 거래 실행 :

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

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

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

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

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

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

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

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