| PostgreSQL 9.2.24 문서 | ||||
|---|---|---|---|---|
| 배트맨 토토 PostgreSQL : 문서 : 9.2 : 트랜잭션 격리 | 사설 토토 : 문서 : 9.2 : 동시성 제어 | 제13장. 동시성 제어 | 다음 | |
포스트그레SQL다양한 기능을 제공합니다 테이블의 데이터에 대한 동시 액세스를 제어하는 토토 꽁 머니 모드입니다. 이것들 모드는 애플리케이션 제어 토토 꽁 머니에 사용될 수 있습니다. 상황MVCC하지 않습니다 원하는 행동을 제공하십시오. 또한 대부분의PostgreSQL명령이 자동으로 획득됩니다. 참조된 테이블이 올바른지 확인하기 위한 적절한 모드 토토 꽁 머니 명령이 실행되는 동안 호환되지 않는 방식으로 삭제되거나 수정되지 않습니다. 실행합니다. (예를 들어,잘라내기할 수 없습니다 동일한 작업에 대한 다른 작업과 동시에 안전하게 실행될 수 있습니다. 테이블에 대해 배타적 토토 꽁 머니을 획득하여 적용합니다. 그.)
현재 해결되지 않은 토토 꽁 머니 목록을 조사하려면 데이터베이스 서버는 다음을 사용합니다.pg_locks시스템 보기. 자세한 내용은 토토 꽁 머니 관리자 하위 시스템의 상태를 모니터링하려면 다음을 참조하세요.토토 사이트 추천 : 문서 : 9.2 : 데이터베이스 활동 모니터링.
아래 목록은 사용 가능한 토토 꽁 머니 모드와 자동으로 사용되는 컨텍스트포스트그레SQL. 당신은 또한 다음 중 하나를 얻을 수 있습니다 이러한 토토 꽁 머니은 다음 명령을 사용하여 명시적으로 잠급니다.토토 꽁 머니. 이 모든 토토 꽁 머니 모드는 이름에 다음 단어가 포함된 경우에도 테이블 수준 토토 꽁 머니입니다."행"; 토토 꽁 머니 모드의 이름 역사적이다. 어느 정도 이름은 전형적인 것을 반영합니다. 각 토토 꽁 머니 모드의 사용법 — 그러나 의미는 모두 동일합니다. 한 토토 꽁 머니 모드와 다른 토토 꽁 머니 모드의 유일한 실제 차이점은 다음과 같습니다. 각각 충돌하는 토토 꽁 머니 모드 세트(참조테이블 13-2). 두 트랜잭션은 충돌하는 토토 꽁 머니을 보유할 수 없습니다. 동시에 같은 테이블에 모드가 있습니다. (단, 거래는 결코 그 자체와 충돌하지 않습니다. 예를 들어 다음과 같습니다. 획득접속 독점토토 꽁 머니 및 나중에 획득액세스 공유토토 꽁 머니 동일한 표.) 충돌하지 않는 토토 꽁 머니 모드를 유지할 수 있습니다. 많은 트랜잭션을 동시에 수행합니다. 특히 다음 사항에 유의하세요. 일부 토토 꽁 머니 모드는 자체 충돌을 일으킵니다(예:접속 독점토토 꽁 머니을 유지할 수 없습니다 한 번에 두 개 이상의 거래로), 다른 거래는 그렇지 않음 자체 충돌(예:액세스 공유토토 꽁 머니은 여러 트랜잭션에 의해 유지될 수 있습니다.
테이블 수준 토토 꽁 머니 모드
다음과의 충돌액세스 독점토토 꽁 머니 모드 전용.
그선택명령은 참조 테이블에서 이 모드를 잠급니다. 일반적으로 어떤 그것만 쿼리해 보세요읽기테이블이고 그렇지 않습니다. 수정하면 이 토토 꽁 머니 모드가 획득됩니다.
다음과의 충돌독점그리고접속 독점토토 꽁 머니 모드.
그업데이트를 위해 선택그리고공유 선택명령 대상 테이블에서 이 모드의 토토 꽁 머니을 획득합니다. 게다가액세스 공유토토 꽁 머니 참조되었지만 선택되지 않은 다른 테이블에서업데이트용/공유용).
다음과의 충돌공유, 공유 행 독점, 독점및액세스 독점토토 꽁 머니 모드.
명령어업데이트, 삭제및삽입다음에서 이 토토 꽁 머니 모드를 획득하세요. 대상 테이블(추가로액세스 공유다른 참조 테이블에 대한 토토 꽁 머니). 에서 일반적으로 이 토토 꽁 머니 모드는 모든 명령으로 획득됩니다. 그수정 데이터테이블에.
다음과의 충돌업데이트 공유 독점, 공유, 행 독점 공유, 독점및액세스 독점토토 꽁 머니 모드. 이 모드는 테이블을 보호합니다 동시 스키마 변경에 대비하고진공실행됩니다.
취득자진공(없이전체), 분석, 색인 생성 동시에및 일부 형태의테이블 변경.
다음과의 충돌행 독점, 업데이트 공유 독점, 공유 행 독점, 독점및접속 독점토토 꽁 머니 모드. 이 모드는 동시 데이터로부터 테이블을 보호합니다. 변경됩니다.
취득자색인 생성(없이동시).
다음과의 충돌행 독점, 업데이트 공유 독점, 공유, 공유 행 독점, 독점및액세스 독점토토 꽁 머니 모드. 이 모드는 테이블을 보호합니다 동시 데이터 변경에 대비하고 자체 배타적이므로 한 번에 하나의 세션만 보유할 수 있습니다.
이 토토 꽁 머니 모드는 자동으로 획득되지 않습니다.PostgreSQL명령.
다음과의 충돌행 공유, 행 독점, 업데이트 독점 공유, 공유, 공유 행 독점, 독점및접속 독점토토 꽁 머니 모드. 이 모드는 동시만 허용합니다.액세스 공유토토 꽁 머니, 즉 읽기만 가능 테이블은 트랜잭션과 병렬로 진행될 수 있습니다. 이 토토 꽁 머니 모드를 유지하고 있습니다.
이 토토 꽁 머니 모드는 테이블에서 자동으로 획득되지 않습니다. 누구든지PostgreSQL명령.
모든 모드의 토토 꽁 머니과 충돌합니다(액세스 공유, 행 공유, 행 독점, 업데이트 독점 공유, 공유, 공유 행 독점, 독점, 그리고접속 독점). 이 모드 보유자가 유일한 거래임을 보장합니다. 어떤 방식으로든 테이블에 액세스합니다.
다음에 의해 획득됨테이블 변경, 드롭 테이블, 잘라내기, REINDEX, 클러스터, 그리고진공이 가득 참명령. 이 은(는) 기본 토토 꽁 머니 모드이기도 합니다.락 테이블지정하지 않은 문 명시적으로 모드입니다.
팁:만액세스 독점토토 꽁 머니 블록 a선택(없이에 대한 업데이트/공유) 진술.
일단 토토 꽁 머니을 획득하면 일반적으로 토토 꽁 머니이 종료될 때까지 유지됩니다. 거래. 그러나 설정된 후에 토토 꽁 머니을 획득하면 저장점, 저장점이 다음인 경우 토토 꽁 머니이 즉시 해제됩니다. 로 롤백되었습니다. 이는 다음의 원칙과 일치합니다.롤백모든 효과를 취소합니다. 저장점 이후 명령. 획득한 토토 꽁 머니에도 동일하게 적용됩니다. a 이내PL/pgSQL예외 블록: 블록에서 오류가 탈출하면 획득한 토토 꽁 머니이 해제됩니다. 그 안에.
테이블 수준 토토 꽁 머니 외에도 행 수준 토토 꽁 머니이 있습니다. 이는 배타적 토토 꽁 머니 또는 공유 토토 꽁 머니일 수 있습니다. 독점적인 행 수준 특정 행에 대한 토토 꽁 머니은 행이 자동으로 획득됩니다. 업데이트 또는 삭제되었습니다. 토토 꽁 머니은 트랜잭션이 완료될 때까지 유지됩니다. 테이블 수준 토토 꽁 머니과 마찬가지로 커밋하거나 롤백합니다. 행 수준 토토 꽁 머니은 데이터 쿼리에 영향을 주지 않습니다. 그들은 단지 차단작성자를 같은 행에.
행에 배타적 행 수준 토토 꽁 머니을 획득하려면 실제로 행을 수정하려면 다음을 사용하여 행을 선택하세요.업데이트를 위해 선택. 행 수준에서는 토토 꽁 머니이 획득되면 트랜잭션이 여러 행을 업데이트할 수 있습니다. 갈등을 두려워하지 않는 시간.
행에서 공유된 행 수준 토토 꽁 머니을 얻으려면 행을 선택하십시오. 와 함께공유 선택. 공유 토토 꽁 머니 다른 거래가 동일한 것을 획득하는 것을 막지 않습니다. 공유 토토 꽁 머니. 그러나 거래 업데이트는 허용되지 않습니다. 다른 행이 있는 행을 삭제하거나 독점적으로 잠급니다. 트랜잭션이 공유 토토 꽁 머니을 보유합니다. 그렇게 하려는 시도는 공유 토토 꽁 머니이 해제될 때까지 차단합니다.
포스트그레SQL기억하지 않음 메모리의 수정된 행에 대한 정보가 없으므로 한 번에 잠기는 행 수에 대한 제한. 그러나, 행을 잠그면 디스크 쓰기가 발생할 수 있습니다. 예:업데이트를 위해 선택표시할 선택된 행을 수정합니다. 잠겨 있으므로 디스크 쓰기가 발생합니다.
테이블 및 행 토토 꽁 머니 외에도 페이지 수준 토토 꽁 머니 공유/독점 토토 꽁 머니은 읽기/쓰기 액세스를 제어하는 데 사용됩니다. 공유 버퍼 풀의 테이블 페이지. 이 토토 꽁 머니이 해제되었습니다. 행을 가져오거나 업데이트한 직후. 신청 개발자는 일반적으로 페이지 수준에 관심을 가질 필요가 없습니다. 토토 꽁 머니이 있지만 여기서는 완전성을 위해 언급했습니다.
명시적 토토 꽁 머니을 사용하면 다음과 같은 가능성이 높아질 수 있습니다.교착상태, 여기서 2개(또는 그 이상) 각 트랜잭션은 상대방이 원하는 토토 꽁 머니을 보유합니다. 예를 들어, 트랜잭션 1이 테이블 A에 대해 배타적 토토 꽁 머니을 획득한 경우 테이블 B에 대한 배타적 토토 꽁 머니을 획득하려고 시도하는 동안 트랜잭션 2에는 이미 배타적으로 잠긴 테이블 B가 있으며 이제 테이블 A에 대한 배타적 토토 꽁 머니을 원하지만 어느 쪽도 할 수 없습니다. 계속하세요.PostgreSQL교착 상태 상황을 자동으로 감지하고 이를 해결합니다. 관련된 거래 중 하나를 중단하여 완료할 다른 사람. (정확히 어떤 거래가 이루어질 것인지 중단된 것은 예측하기 어렵고 의존해서는 안 됩니다. 에.)
다음의 결과로 교착 상태가 발생할 수도 있습니다. 행 수준 토토 꽁 머니(따라서 명시적인 경우에도 발생할 수 있음) 토토 꽁 머니은 사용되지 않습니다). 두 개가 동시에 발생하는 경우를 고려하십시오. 트랜잭션이 테이블을 수정합니다. 첫 번째 거래 실행:
UPDATE 계정 SET 잔액 = 잔액 + 100.00 WHERE 계정 번호 = 11111;
이것은 지정된 행에 행 수준 토토 꽁 머니을 획득합니다 계좌번호. 그런 다음 두 번째 트랜잭션이 실행됩니다.
UPDATE 계정 SET 잔액 = 잔액 + 100.00 WHERE acctnum = 22222; UPDATE 계정 SET 잔액 = 잔액 - 100.00 WHERE acctnum = 11111;
첫 번째업데이트문장 지정된 행에서 행 수준 토토 꽁 머니을 성공적으로 획득했으므로 해당 행을 업데이트하는 데 성공합니다. 그러나 두 번째업데이트문은 해당 행이 업데이트를 시도하는 중입니다. 이미 잠겨 있으므로 기다립니다. 토토 꽁 머니을 획득한 트랜잭션이 완료되도록 합니다. 트랜잭션 2는 이제 트랜잭션 1이 완료되기를 기다리고 있습니다. 실행을 계속하기 전에. 이제 거래 1번 실행:
UPDATE 계정 SET 잔액 = 잔액 - 100.00 WHERE acctnum = 22222;
트랜잭션 1은 다음에 행 수준 토토 꽁 머니을 획득하려고 시도합니다. 행을 지정했지만 그럴 수 없습니다. 트랜잭션 2가 이미 보유하고 있습니다. 그런 자물쇠. 따라서 트랜잭션 2가 완료될 때까지 기다립니다. 따라서, 거래 1은 거래 2에서 차단되고 거래는 트랜잭션 1에서 두 개가 차단됩니다: 교착 상태 상태입니다.PostgreSQL이것을 감지할 것입니다 상황을 파악하고 거래 중 하나를 중단합니다.
교착상태에 대한 최선의 방어는 일반적으로 교착상태를 피하는 것입니다 데이터베이스를 사용하는 모든 애플리케이션이 일관된 순서로 여러 개체에 대한 토토 꽁 머니을 획득합니다. 에서 위의 예에서 두 트랜잭션 모두에서 행을 업데이트한 경우 동일한 순서라면 교착 상태가 발생하지 않았을 것입니다. 또한 객체에 대해 획득한 첫 번째 토토 꽁 머니을 확인합니다. 트랜잭션은 필요한 가장 제한적인 모드입니다. 그 대상을 위해. 이를 확인하는 것이 불가능한 경우 재시도를 통해 교착 상태를 즉시 처리할 수 있습니다. 교착 상태로 인해 중단된 트랜잭션.
교착 상태 상황이 감지되지 않는 한 트랜잭션은 테이블 수준 또는 행 수준 토토 꽁 머니을 찾는 것은 대기합니다. 충돌하는 토토 꽁 머니이 무기한 해제됩니다. 이는 다음을 의미합니다. 애플리케이션이 트랜잭션을 열어두는 것은 좋지 않은 생각입니다. 오랜 시간 동안(예: 사용자 입력을 기다리는 동안).
PostgreSQL수단을 제공합니다 애플리케이션에서 정의한 의미를 갖는 토토 꽁 머니을 생성하기 위한 것입니다. 이것들은권고 토토 꽁 머니, 시스템에서 사용을 강제하지 않기 때문에 — 이는 사용자에게 달려 있습니다. 올바르게 사용하려면 응용 프로그램을 사용하세요. 권고 토토 꽁 머니이 유용할 수 있습니다. MVCC에 적합하지 않은 토토 꽁 머니 전략의 경우 모델. 예를 들어, 권고 토토 꽁 머니의 일반적인 용도는 다음과 같습니다. 소위 말하는 비관적 토토 꽁 머니 전략을 에뮬레이션합니다."플랫 파일"데이터 관리 시스템. 테이블에 저장된 플래그는 동일한 용도로 사용될 수 있습니다. 목적에 따라 권고 토토 꽁 머니은 더 빠르고, 테이블 팽창을 방지하며, 작업이 끝나면 서버에서 자동으로 정리됩니다. 세션.
자문 토토 꽁 머니을 획득하는 방법에는 두 가지가 있습니다.PostgreSQL: 세션 수준에서 또는 거래 수준에서. 세션 수준에서 획득한 후에는 권고 토토 꽁 머니은 명시적으로 해제되거나 세션이 종료될 때까지 유지됩니다. 끝납니다. 표준 토토 꽁 머니 요청과 달리 세션 수준 권고 토토 꽁 머니 요청은 트랜잭션 의미를 따르지 않습니다. 토토 꽁 머니 나중에 롤백되는 트랜잭션 중에 획득된 롤백 후에도 여전히 유지되며 마찬가지로 토토 꽁 머니 해제도 유지됩니다. 나중에 호출 트랜잭션이 실패하더라도 유효합니다. 자물쇠 소유 프로세스를 통해 여러 번 획득할 수 있습니다. 각각에 대해 완료된 토토 꽁 머니 요청에는 해당 토토 꽁 머니 해제가 있어야 합니다. 토토 꽁 머니이 실제로 해제되기 전에 요청하세요. 거래 수준 반면에 토토 꽁 머니 요청은 일반 토토 꽁 머니처럼 동작합니다. 요청: 요청이 끝나면 자동으로 해제됩니다. 트랜잭션이며 명시적인 토토 꽁 머니 해제 작업이 없습니다. 이 행동은 종종 세션 수준보다 더 편리합니다. 권고 토토 꽁 머니의 단기 사용에 대한 동작입니다. 동일한 세션 수준 및 트랜잭션 수준 토토 꽁 머니 요청 권고 토토 꽁 머니 식별자는 예상되는 방식으로 서로를 차단합니다. 방법. 세션이 이미 특정 권고 토토 꽁 머니을 보유하고 있는 경우 추가 요청은 다른 요청이 있더라도 항상 성공합니다. 세션이 토토 꽁 머니을 기다리고 있습니다. 이 말은 사실이다 기존 토토 꽁 머니 유지 및 새 요청 여부에 관계없이 세션 수준 또는 거래 수준에 있습니다.
모든 자물쇠와 마찬가지로포스트그레SQL, 전체 권고 목록 현재 모든 세션이 보유하고 있는 토토 꽁 머니은 다음에서 찾을 수 있습니다.pg_locks시스템 뷰.
권고 토토 꽁 머니과 일반 토토 꽁 머니은 모두 공유 폴더에 저장되어 있습니다. 구성에 따라 크기가 정의되는 메모리 풀 변수max_locks_per_transaction그리고max_connections. 이 메모리나 서버가 소진되지 않도록 주의해야 합니다. 토토 꽁 머니을 전혀 부여할 수 없습니다. 이는 상위 값을 부과합니다. 서버가 부여할 수 있는 권고 토토 꽁 머니 수 제한 일반적으로 방법에 따라 수만에서 수십만 서버가 구성되었습니다.
특정한 경우 권고 토토 꽁 머니 방법을 사용하는 경우, 특히 명시적인 순서와 관련된 쿼리에서 및제한절, 제어에 주의를 기울여야 합니다. SQL 표현식의 순서로 인해 획득된 토토 꽁 머니 평가됩니다. 예를 들면:
FROM foo WHERE id = 12345에서 pg_advisory_lock(id) 선택; -- 알았어 SELECT pg_advisory_lock(id) FROM foo WHERE id 12345 LIMIT 100; -- 위험해요! pg_advisory_lock(q.id) FROM 선택 ( foo에서 ID 선택 WHERE id 12345 LIMIT 100 ) q; -- 알았어
위 쿼리에서 두 번째 형식은 위험합니다.제한보장되지는 않습니다 토토 꽁 머니 기능이 실행되기 전에 적용됩니다. 이것은 아마도 응용프로그램이 작동하지 않아 일부 토토 꽁 머니을 획득하게 됩니다. 기대하고 있으므로 릴리스에 실패합니다(종료될 때까지). 세션). 애플리케이션의 관점에서 이러한 토토 꽁 머니은 여전히 볼 수 있지만 매달려 있을 것입니다.pg_locks.
권고 토토 꽁 머니을 조작하기 위해 제공되는 기능은 다음과 같습니다. 설명됨섹션 9.26.8.