PostgreSQL테이블의 데이터에 대한 동시 액세스를 제어하기위한 다양한 롤 토토 모드를 제공합니다. 이 모드는 상황에서 응용 프로그램 제어 롤 토토에 사용될 수 있습니다.MVCC원하는 행동을 제공하지 않습니다. 또한, 대부분PostgreSQL명령은 명령이 실행되는 동안 참조 된 테이블이 호환되지 않는 방식으로 삭제되거나 수정되지 않도록 적절한 모드의 롤 토토을 자동으로 획득합니다. (예를 들어,Truncate
동일한 테이블의 다른 작업과 동시에 안전하게 실행할 수 없으므로 AN을 얻습니다.액세스 독점
테이블에 잠그십시오.)
데이터베이스 서버에서 현재 미결 롤 토토 롤 토토 장치 목록을 검사하려면 사용하십시오.PG_LOCKS
시스템보기. 롤 토토 관리자 서브 시스템의 상태 모니터링에 대한 자세한 내용은 참조하십시오.젠 토토 : 문서 : 16 : 28 장. 데이터베이스 활동 모니터링.
아래 목록은 사용 가능한 롤 토토 모드와 컨텍스트가 자동으로 사용되는 컨텍스트를 보여줍니다PostgreSQL. 또한 명령 으로이 자물쇠를 명시 적으로 얻을 수 있습니다.롤 토토. 이름에 단어가 포함되어 있어도이 모든 롤 토토 모드는 테이블 레벨 롤 토토입니다.“Row”; 롤 토토 모드의 이름은 역사적입니다. 어느 정도까지 이름은 각 롤 토토 모드의 일반적인 사용법을 반영하지만 의미는 모두 동일합니다. 하나의 롤 토토 모드와 다른 롤 토토 모드의 유일한 차이점은 각 충돌이있는 롤 토토 모드 세트입니다 (참조표 13.2). 두 개의 트랜잭션은 동시에 동시에 상충되는 모드의 롤 토토을 보유 할 수 없습니다. (그러나 거래는 그 자체와 상충되지 않습니다. 예를 들어, 획득 할 수 있습니다액세스 독점
롤 토토 및 나중에 인수액세스 공유
동일한 테이블을 잠그십시오.) 비 분화 롤 토토 모드는 많은 트랜잭션에 의해 동시에 유지 될 수 있습니다. 특히 일부 롤 토토 모드는 자체적으로 자체적으로 표시됩니다 (예 : AN액세스 독점
롤 토토은 한 번에 둘 이상의 거래로 유지 될 수 없음) 반면 다른 사람들은 자체적으로 분류되지 않습니다 (예 : AN액세스 공유
롤 토토 장치는 여러 거래에 의해 유지 될 수 있습니다).
테이블 레벨 롤 토토 모드
액세스 공유
(accesssharelock
)액세스 독점
롤 토토 모드 만.
theselect
명령은 참조 테이블 에서이 모드의 롤 토토을 얻습니다. 일반적으로 모든 쿼리 만읽기테이블과 수정하지 않으면이 롤 토토 모드를 얻습니다.
행 쉐어
(RowsharElock
)독점
and액세스 독점
롤 토토 모드.
theselect
명령은 모든 테이블 에서이 모드의 롤 토토을 획득합니다.업데이트
, 키 업데이트 없음
, 공유
또는KEY SHARE
옵션이 지정되어 있습니다 (외에액세스 공유
명시 적없이 참조되는 다른 테이블의 롤 토토for ...
롤 토토 옵션).
Row Exclusive
(RowExclusivelock
)공유
, 공유 ROW 독점
, 독점
및액세스 독점
롤 토토 모드.
명령업데이트
, 삭제
, 삽입
및병합
대상 테이블 에서이 롤 토토 모드를 획득합니다 (액세스 공유
다른 참조 테이블의 롤 토토). 일반적 으로이 롤 토토 모드는 모든 명령에 의해 획득됩니다.데이터 수정테이블에서.
공유 업데이트 독점
(ShareUpdateExclusivelock
)공유 업데이트 독점
, 공유
, 공유 ROW 독점
, 독점
및액세스 독점
롤 토토 모드. 이 모드는 동시 스키마 변경으로부터 테이블을 보호하고진공
실행.
획득진공
(full
),분석
, 동시에 색인 생성
, 통계 생성
, 의견
, Reindex 동시에
및 특정Alter Index
andAlter Table
변형 (자세한 내용은이 명령의 문서를 참조하십시오).
공유
(Sharelock
)Row Exclusive
, 공유 업데이트 독점
, 공유 ROW 독점
, 독점
및액세스 독점
롤 토토 모드. 이 모드는 동시 데이터 변경으로부터 테이블을 보호합니다.
획득색인 생성
(동시에
).
공유 행 독점
(Sharerowexclusivelock
)Row Exclusive
, 공유 업데이트 독점
, 공유
, 공유 행 독점
, 독점
및액세스 독점
롤 토토 모드. 이 모드는 동시 데이터 변경으로부터 테이블을 보호하며 한 번에 한 세션 만 보유 할 수 있도록 자체적으로 독점적입니다.
획득트리거 만들기
그리고 일부 형태의Alter Table
.
독점
(Exclusivelock
)Row Share
, Row Exclusive
, 공유 업데이트 독점
, 공유
, 공유 ROW 독점
, 독점
및액세스 독점
롤 토토 모드. 이 모드는 동시 만 허용액세스 공유
롤 토토.
획득Refresh Restocized View 동시에
.
액세스 독점
(accessexclusivelock
)모든 모드의 롤 토토과 충돌 (액세스 공유
, Row Share
, Row Exclusive
, 공유 업데이트 독점
, share
, 공유 ROW 독점
, 독점
및액세스 독점
). 이 모드는 홀더가 어떤 식 으로든 테이블에 액세스하는 유일한 트랜잭션임을 보장합니다.
획득드롭 테이블
, Truncate
, Reindex
, 클러스터
, 진공 Full
및상쾌한 구체화보기
(동시에
) 명령. 여러 형태의Alter Index
andAlter Table
또한이 레벨에서 롤 토토을 얻습니다. 이것은 또한의 기본 롤 토토 모드입니다.롤 토토 테이블
모드를 명시 적으로 지정하지 않는 진술.
al액세스 독점
롤 토토 블록 Aselect
(업데이트/공유
) 문.
일단 인수하면, 자물쇠는 일반적으로 거래가 끝날 때까지 유지됩니다. 그러나 SavePoint를 설정 한 후 롤 토토이 획득되면 SavePoint가 다시 롤백되면 롤 토토이 즉시 해제됩니다. 이것은 원칙과 일치합니다.롤백
SavePoint 이후 명령의 모든 효과를 취소합니다. A 내에서 획득 한 자물쇠에 대해서도 마찬가지입니다.PL/PGSQL예외 블록 : 블록에서 오류 탈출이 그 안에 획득 된 롤 토토 장치를 릴리스합니다.
표 13.2. 충돌 롤 토토 모드
요청 된 롤 토토 모드 | 기존 롤 토토 모드 | |||||||
---|---|---|---|---|---|---|---|---|
액세스 공유 |
행 공유 |
Row Excl. |
공유 업데이트 제외 |
공유 |
공유 행 excl. |
제외. |
Access Excl. |
|
액세스 공유 |
x | |||||||
행 점수 |
x | x | ||||||
Row Excl. |
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 | |
Access Excl. |
x | x | x | x | x | x | x | x |
테이블 레벨 롤 토토 외에도로드 레벨 롤 토토 장치가 있으며, 여기에는 컨텍스트가 자동으로 사용되는 컨텍스트와 함께PostgreSQL. 보다표 13.3로드 레벨 롤 토토 충돌의 전체 테이블. 트랜잭션은 다른 잠수함에서도 동일한 행에서 충돌하는 롤 토토 장치를 보유 할 수 있습니다. 그러나 그 외에는 두 개의 거래는 같은 행에 충돌하는 롤 토토 장치를 보유 할 수 없습니다. 로우 레벨 롤 토토은 데이터 쿼리에 영향을 미치지 않습니다. 그들은 만 차단작가와 사물함같은 행으로. 로드 레벨 롤 토토은 트랜잭션 끝 또는 SavePoint 롤백 중에 테이블 레벨 롤 토토과 마찬가지로 릴리스됩니다.
로드 레벨 롤 토토 모드
업데이트
업데이트
select
업데이트를 위해 잠겨 진술서. 이로 인해 현재 트랜잭션이 끝날 때까지 다른 트랜잭션에 의해 잠긴, 수정 또는 삭제되는 것을 방지합니다. 즉, 시도하는 다른 거래업데이트
, 삭제
, 업데이트 선택
, 키 업데이트 없음 선택
, 공유 선택
또는키 공유 선택
이 행은 현재 트랜잭션이 끝날 때까지 차단됩니다. 거꾸로,업데이트 선택
같은 행에서 해당 명령을 실행 한 동시 트랜잭션을 기다린 다음 업데이트 된 행을 잠그고 반환합니다 (또는 행이 삭제 된 경우 행이 없음). A 내에서반복 가능한 읽기
또는SERIALIZABLE
트랜잭션이 시작된 이후로 롤 토토 될 행이 변경되면 오류가 발생합니다. 추가 논의는 참조PostgreSQL : 문서 : 16 : 13.4. 응용 프로그램 수준에서의 토토 커뮤니티 일관성 검사.
the업데이트
롤 토토 모드도 획득합니다삭제
줄에 그리고 또한업데이트
특정 열의 값을 수정합니다. 현재에 고려 된 열 세트업데이트
케이스는 외국 키에 사용할 수있는 고유 한 지수를 가진 것입니다 (따라서 부분 색인 및 표현 적 인덱스는 고려되지 않음). 그러나 이것은 향후 변화 할 수 있습니다..
키 업데이트 없음
비슷하게 동작업데이트
- 획득 한 롤 토토이 약한 경우를 제외하고 :이 롤 토토 장치는 차단되지 않습니다키 공유 선택
같은 행에서 롤 토토을 얻으려고 시도하는 명령. 이 롤 토토 모드는 또한에 의해 획득됩니다.업데이트
획득하지 않는 것은업데이트
롤 토토.
공유
비슷하게 동작키 업데이트 없음
- 검색된 각 행에서 독점적 인 롤 토토이 아닌 공유 롤 토토 장치를 얻는 것을 제외하고. 공유 롤 토토 장치는 다른 트랜잭션이 수행되는 것을 막는다업데이트
, 삭제
, 업데이트 선택
또는키 업데이트 없음 선택
이 행에서는이 행에서 수행하는 것을 방해하지는 않습니다공유 선택
또는키 공유 선택
.
키 공유
비슷하게 동작share
, 롤 토토이 약한 경우를 제외하고 :업데이트 선택
차단되었지만키 업데이트 없음 선택
. 키 공유 롤 토토 장치는 다른 트랜잭션이 수행되는 것을 막는다삭제
또는 어떤업데이트
키 값을 변경하지만 다른 사람은 아닙니다업데이트
키 업데이트 없음 선택
, 공유 선택
, 또는키 공유 선택
.
PostgreSQL메모리에서 수정 된 행에 대한 정보는 기억되지 않으므로 한 번에 잠긴 행의 수에는 제한이 없습니다. 그러나 행을 잠그면 디스크 쓰기가 발생할 수 있습니다 (예 :업데이트 선택
선택한 행을 고정시키기 위해 선택한 행을 수정하면 디스크가 쓰여집니다.
표 13.3. 충돌하는 행 수준 롤 토토
요청 된 롤 토토 모드 | 현재 롤 토토 모드 | |||
---|---|---|---|---|
KEY SHARE | 공유 | 키 업데이트 없음 | 업데이트 | |
KEY SHARE | x | |||
공유 | x | x | ||
키 업데이트 없음 | x | x | x | |
업데이트 | x | x | x | x |
테이블 및 행 롤 토토 외에도 페이지 수준의 공유/독점 롤 토토 장치는 공유 버퍼 풀의 테이블 페이지에 대한 읽기/쓰기 액세스를 제어하는 데 사용됩니다. 이 자물쇠는 행이 가져 오거나 업데이트 된 직후에 해제됩니다. 응용 프로그램 개발자는 일반적으로 페이지 수준의 롤 토토에 관심이 없지만 완전성을 위해 언급되어 있습니다.
명시 적 롤 토토을 사용하면의 가능성이 높아질 수 있습니다.교착 상태예를 들어, 트랜잭션 1이 표 A에 대한 독점 롤 토토을 획득 한 다음 표 B에서 독점 롤 토토을 얻으려고 시도하는 반면, 트랜잭션 2는 이미 독점적으로 롤 토토 된 표 B를 사용했으며 이제 표 A에 대한 독점 롤 토토을 원한다면 어느 쪽도 진행할 수 없습니다..PostgreSQL교착 상태를 자동으로 감지하고 관련된 트랜잭션 중 하나를 중단하여 다른 사람이 완료 할 수 있도록합니다. (정확히 어떤 거래가 중단 될지 예측하기 어렵고 의존해서는 안됩니다.)
교착 상태는로드 레벨 롤 토토으로 인해 발생할 수 있습니다 (따라서 명시 적 롤 토토이 사용되지 않더라도 발생할 수 있음). 두 개의 동시 트랜잭션이 표를 수정하는 경우를 고려하십시오. 첫 번째 트랜잭션이 실행됩니다.
업데이트 계정 설정 밸런스 = 밸런스 + 100.00 여기서 acctnum = 11111;
이것은 지정된 계정 번호로 행의 행 수준 롤 토토을 취득합니다. 그런 다음 두 번째 트랜잭션이 실행됩니다.
업데이트 계정 설정 밸런스 = 밸런스 + 100.00 여기서 acctnum = 22222; 계정 업데이트 설정 밸런스 = 밸런스 -100.00 여기서 acctnum = 11111;
첫 번째업데이트
명령문은 지정된 행에서로드 레벨 롤 토토을 성공적으로 획득하므로 해당 행을 업데이트하는 데 성공합니다. 그러나 두 번째업데이트
명령문은 업데이트를 시도하는 행이 이미 잠겨 있음을 발견하므로 롤 토토이 완료 될 수있는 거래를 기다립니다. 트랜잭션 2는 이제 실행을 계속하기 전에 거래 1을 완료하기를 기다리고 있습니다. 이제 트랜잭션이 실행됩니다.
업데이트 계정 세트 밸런스 = 밸런스 -100.00 여기서 acctnum = 22222;
트랜잭션 1은 지정된 행에서로드 레벨 롤 토토을 얻으려고 시도하지만 : 트랜잭션 2는 이미 그러한 롤 토토을 보유하고 있습니다. 따라서 거래 2가 완료되기를 기다립니다. 따라서 트랜잭션 1은 거래 2에서 차단되며 거래 2는 트랜잭션 1에 차단됩니다. 교착 상태.PostgreSQL이 상황을 감지하고 거래 중 하나를 중단합니다.
교착 상태에 대한 최상의 방어는 일반적으로 데이터베이스를 사용하는 모든 응용 프로그램이 일관된 순서로 여러 객체에서 롤 토토 장치를 획득 한 것을 확신함으로써이를 피하는 것입니다. 위의 예에서, 두 거래 모두 동일한 순서로 행을 업데이트 한 경우 교착 상태가 발생하지 않았을 것입니다. 또한 트랜잭션에서 객체에서 획득 한 첫 번째 롤 토토 장치가 해당 객체에 필요한 가장 제한적인 모드인지 확인해야합니다. 이를 미리 확인하는 것이 불가능한 경우 교착 상태로 인해 중단되는 거래를 다시 시도하여 교착 상태를 처리 할 수 있습니다..
교착 상태 상황이 감지되지 않는 한, 테이블 레벨 또는로드 레벨 롤 토토을 원하는 거래는 충돌 롤 토토 장치가 해제 될 때까지 무기한 대기합니다. 즉, 응용 프로그램이 트랜잭션을 장시간 열어 두는 것이 좋지 않다는 것을 의미합니다 (예 : 사용자 입력을 기다리는 동안).
PostgreSQL응용 프로그램 정의 의미가있는 롤 토토 장치를 생성하는 수단을 제공합니다. 이것들은라고합니다.자문 롤 토토, 시스템이 사용을 시행하지 않기 때문에 올바르게 사용하는 것은 응용 프로그램에 달려 있습니다. 자문 롤 토토은 MVCC 모델에 어색한 롤 토토 전략에 유용 할 수 있습니다. 예를 들어, 자문 롤 토토 장치의 일반적인 사용은 소위의 전형적인 비관적 롤 토토 전략을 모방하는 것입니다“플랫 파일”데이터 관리 시스템. 테이블에 저장된 깃발은 동일한 목적으로 사용될 수 있지만 자문 롤 토토 장치는 더 빠르고 테이블 부풀어 오르고 세션이 끝날 때 서버에 의해 자동으로 정리됩니다..
자문 롤 토토을 획득하는 두 가지 방법이 있습니다PostgreSQL: 세션 수준 또는 트랜잭션 수준에서. 세션 수준에서 인수되면, 명시 적으로 릴리스되거나 세션이 종료 될 때까지 자문 롤 토토이 유지됩니다. 표준 롤 토토 요청과 달리 세션 수준의 자문 롤 토토 요청은 트랜잭션 시맨틱을 존중하지 않습니다. 나중에 롤백으로 롤백하는 트랜잭션 중에 획득 한 롤 토토은 여전히 롤백 후에도 유지되며 마찬가지로 호출 트랜잭션이 나중에 실패하더라도 롤 토토 해제는 효과적입니다. 자물쇠는 소유 프로세스에 의해 여러 번 획득 될 수 있습니다. 완성 된 각 롤 토토 요청에 대해 롤 토토이 실제로 해제되기 전에 해당 롤 토토 해제 요청이 있어야합니다. 반면에 거래 수준의 롤 토토 요청은 일반 롤 토토 요청과 비슷합니다. 거래가 끝날 때 자동으로 릴리스되며 명시 적 롤 토토 해제 작업이 없습니다. 이 동작은 종종 자문 롤 토토 장치의 단기 사용에 대한 세션 수준 동작보다 더 편리합니다. 동일한 자문 롤 토토 식별자에 대한 세션 수준 및 거래 수준 롤 토토 요청은 예상되는 방식으로 서로를 차단합니다. 세션이 이미 주어진 자문 롤 토토 장치를 보유하고 있다면 다른 세션이 롤 토토을 기다리는 경우에도 추가 요청이 항상 성공합니다. 이 진술은 기존 롤 토토 홀드와 새 요청이 세션 수준 또는 트랜잭션 수준에 있는지 여부에 관계없이 사실입니다.
모든 자물쇠처럼PostgreSQL, 현재 모든 세션에서 보유한 자문 롤 토토 장치 목록은에서 찾을 수 있습니다.pg_locks
시스템보기
자문 롤 토토 장치와 일반 롤 토토은 모두 구성 변수에 의해 크기가 정의되는 공유 메모리 풀에 저장됩니다max_locks_per_transaction및max_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.27.10.
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면