윈 토토 : 문서 : 9.4 : 윈 토토 | |||
---|---|---|---|
토토 사이트 순위 PostgreSQL : 문서 : 9.4 : 소개 | 사설 토토 사이트 : 문서 : 9.4 : 사설 토토 사이트 제어 | 13 장. 동시성 제어 | PostgreSQL : 문서 : 9.4 : 명시 적 토토 베이 |
theSQL표준은 4 가지 수준의 메이저 토토 사이트 격리를 정의합니다. 가장 엄격한 것은 직렬화 가능이며, 이는 단락에서 표준에 의해 정의되어 일련의 직렬화 가능한 메이저 토토 사이트 세트의 동시 실행이 한 번에 하나씩 실행하는 것과 동일한 효과를 생성 할 수 있다고 말합니다. 다른 세 가지 수준은 현상 측면에서 정의되며, 동시 거래 간의 상호 작용으로 인해 각 레벨에서 발생하지 않아야합니다. 표준은 직렬화 가능의 정의로 인해 이러한 현상 중 어느 것도 해당 수준에서 불가능하다고 지적합니다. (이것은 놀라운 일이 아닙니다. 거래의 효과가 한 번에 하나씩 실행 된 것과 일치해야한다면 상호 작용으로 인한 현상을 어떻게 볼 수 있습니까?)
다양한 수준에서 금지되는 현상은 다음과 같습니다.
메이저 토토 사이트은 동시에 커밋되지 않은 거래에 의해 작성된 데이터를 읽습니다.
메이저 토토 사이트은 이전에 읽은 데이터를 다시 읽고 다른 메이저 토토 사이트에 의해 데이터가 수정되었음을 발견합니다 (초기 읽기 이후에 커밋 된)..
메이저 토토 사이트은 검색 조건을 만족시키는 행을 반환하는 쿼리를 다시 실행하고 최근에 커미셔닝 된 또 다른 메이저 토토 사이트으로 인해 조건을 만족하는 행이 변경되었음을 발견합니다..
4 개의 메이저 토토 사이트 격리 수준과 해당 동작은에 설명되어 있습니다.표 13-1.
표 13-1. 기준SQL거래 격리 수준
격리 레벨 | 더러운 읽기 | 반복 할 수없는 읽기 | Phantom Read |
---|---|---|---|
커밋되지 않은 읽기 | 가능 | 가능 | 가능 |
Committed | 불가능 | 가능 | 가능 |
반복 가능한 읽기 | 가능하지 않음 | 불가능 | 가능 |
SERIALIZABLE | 불가능 | 불가능 | 불가능 |
inPostgreSQL, 4 개의 표준 트랜잭션 격리 수준 중 하나를 요청할 수 있습니다. 그러나 내부적으로는 세 가지 별개의 분리 수준 만 있으며, 이는 저지른 레벨, 반복 가능한 읽기 및 직렬화 가능한 레벨에 해당합니다. 레벨 읽기를 선택하면 커밋되지 않은 레벨을 선택하면 실제로 칭찬을 받고 Phantom Reads는 불가능합니다.PostgreSQL반복 가능한 읽기 구현이므로 실제 격리 수준이 선택한 것보다 엄격 할 수 있습니다. 이것은 SQL 표준에 의해 허용됩니다. 4 개의 격리 수준은 어떤 현상이 일어나지 말아야하는지 정의 할 뿐이며 어떤 현상이 발생 해야하는지 정의하지 않습니다. 그 이유PostgreSQL3 가지 격리 수준 만 제공하는 것은 표준 격리 수준을 Multiversion 동시성 제어 아키텍처에 매핑하는 유일한 방법이라는 것입니다. 이용 가능한 격리 수준의 동작은 다음 하위 섹션에 자세히 설명되어 있습니다.
메이저 토토 사이트의 메이저 토토 사이트 격리 수준을 설정하려면 명령을 사용하십시오메이저 토토 사이트 설정.
중요 :일부PostgreSQL데이터 유형 및 함수에는 거래 동작에 관한 특별한 규칙이 있습니다. 특히 시퀀스에 대한 변경 (따라서 열의 카운터는Serial)는 다른 모든 거래에 즉시 볼 수 있으며 변경 사항이 중단 된 거래가 롤백되지 않습니다. 보다PostgreSQL : 문서 : 9.4 : 토토 핫 조작 함수및섹션 8.1.4.
Committed 읽기의 기본 격리 레벨입니다postgresql. 거래가이 격리 수준을 사용하면 aselect쿼리 (a업데이트/공유조항) 쿼리가 시작되기 전에 커밋 된 데이터 만 본다. 동시 메이저 토토 사이트에 의해 쿼리 실행 중에 커밋되지 않은 데이터 또는 변경 사항이 보이지 않습니다. 사실상 Aselect쿼리는 쿼리가 실행되기 시작하는 즉시 데이터베이스의 스냅 샷을 봅니다. 하지만,select아직 커밋되지는 않았지만 자체 거래 내에서 이전 업데이트가 실행 된 효과가 보입니다. 또한 두 가지 연속select명령은 단일 메이저 토토 사이트 내에 있어도 다른 데이터를 볼 수 있습니다.select두 번째 시작과 두 번째 전select시작.
업데이트, 삭제, 업데이트 선택및공유 선택명령은와 동일하게 행동합니다select대상 행 검색 측면에서 : 명령 시작 시간에 따라 커밋 된 대상 행만 찾을 수 있습니다. 그러나 이러한 대상 행은 발견 될 때까지 다른 동시 거래에 의해 이미 업데이트 (또는 삭제 또는 잠금)되었을 수 있습니다. 이 경우 업데이트가 최초의 업데이트 트랜잭션이 커밋 또는 롤백을 기다릴 때까지 기다립니다 (여전히 진행중인 경우). 첫 번째 업데이트가 롤백되면 그 효과가 부정되고 두 번째 업데이트는 원래 발견 된 행을 업데이트 할 수 있습니다. 첫 번째 업데이트가 커밋하면 첫 번째 업데이트가 삭제 된 경우 두 번째 업데이트는 행을 무시합니다. 그렇지 않으면 업데이트 된 행의 행에 작업을 적용하려고 시도합니다. 명령의 검색 조건 (여기서clause)는 업데이트 된 행의 행 버전이 여전히 검색 조건과 일치하는지 확인하기 위해 재평가되었습니다. 그렇다면 두 번째 업데이트는 업데이트 된 행의 행을 사용하여 작동을 진행합니다. 의 경우업데이트 선택and공유 선택, 이것은 잠겨 있고 클라이언트로 돌아온 행의 업데이트 버전임을 의미합니다.
위 규칙으로 인해 업데이트 명령이 일관되지 않은 스냅 샷을 볼 수 있습니다. 업데이트하려는 동일한 행에 동시 업데이트 명령의 영향을 볼 수 있지만 데이터베이스의 다른 행에 해당 명령의 영향을 볼 수는 없습니다. 이 동작은 복잡한 검색 조건을 포함하는 명령에 부적합한 모드를 부적절하게 만듭니다. 그러나 더 간단한 경우에 적합합니다. 예를 들어 :와 같은 거래로 은행 잔액을 업데이트하는 것을 고려하십시오.
시작; 업데이트 계정 설정 밸런스 = 밸런스 + 100.00 여기서 acctnum = 12345; 업데이트 계정 설정 밸런스 = 밸런스 -100.00 여기서 acctnum = 7534; 저지르다;
그러한 두 거래가 동시에 계정 잔액을 변경하려고 시도하면 두 번째 트랜잭션이 계정 행의 업데이트 된 버전으로 시작하기를 분명히 원합니다. 각 명령은 미리 정해진 행에만 영향을 미치기 때문에 업데이트 된 행 버전을 볼 수있게하면 번거로운 불일치가 발생하지 않습니다.
더 복잡한 사용은 읽기 커밋 모드에서 바람직하지 않은 결과를 생성 할 수 있습니다. 예를 들어, 고려하십시오.삭제다른 명령에 의해 제한 기준에서 추가되고 제거되는 데이터에서 작동하는 명령, 예를 들어, 가정웹 사이트웹 사이트. hits동등한9and10:
시작; 업데이트 웹 사이트 세트 hits = hits + 1; - 다른 세션에서 실행 : hits = 10 인 웹 사이트에서 삭제; 저지르다;
the삭제에도 불구하고 효과가 없을 것입니다웹 사이트. hits = 10전후에 행업데이트. 이것은 사전 행 행 값이 발생하기 때문에 발생합니다9건너 뛰고업데이트완성 및삭제잠금을 얻고 새 행 값이 더 이상 없어10그러나11, 더 이상 기준과 일치하지 않습니다.
Read Commited Mode는 해당 순간에 커밋 된 모든 메이저 토토 사이트을 포함하는 새로운 스냅 샷으로 각 명령을 시작하기 때문에 동일한 거래에서 후속 명령은 커밋 된 동시 거래의 영향을 볼 수 있습니다. 위의 문제점은 A인지 여부입니다.단일명령은 데이터베이스의 절대적으로 일관된 견해를 보게됩니다.
Read Commited 모드에 의해 제공되는 부분 트랜잭션 격리는 많은 응용 프로그램에 적합 하며이 모드는 빠르고 사용하기가 간단합니다. 그러나 모든 경우에 충분하지는 않습니다. 복잡한 쿼리 및 업데이트를 수행하는 응용 프로그램에는 읽기 Commited Mode가 제공하는 것보다 데이터베이스의보다 엄격하게 일관된보기가 필요할 수 있습니다.
the반복 가능한 읽기격리 수준은 거래가 시작되기 전에 커밋 된 데이터 만 볼 수 있습니다. 동시 트랜잭션에 의해 트랜잭션 실행 중에 커밋되지 않은 데이터 또는 변경 사항이 보이지 않습니다. (그러나 쿼리는 아직 커밋되지 않더라도 자체 거래 내에서 실행 된 이전 업데이트의 효과를 볼 수 있습니다.) 이것은보다 강력한 보증입니다.SQL이 격리 수준의 표준 및에 설명 된 모든 현상을 방지합니다표 13-1. 위에서 언급했듯이, 이것은 표준에 의해 구체적으로 허용되며, 여기는에 대해서만 설명합니다.최소보호는 각 격리 수준이 제공해야합니다.
이 레벨은 반복 가능한 읽기 트랜잭션의 쿼리가 시작 시점에서 스냅 샷을 본다는 점에서 저지른 읽기와 다릅니다.거래, 메이저 토토 사이트 내 현재 쿼리가 시작될 때가 아닙니다. 따라서 연속selecta 명령단일트랜잭션은 동일한 데이터를 참조하십시오. 즉, 자신의 거래가 시작된 후 커밋 된 다른 거래의 변경 사항이 표시되지 않습니다..
이 레벨을 사용하는 응용 프로그램은 직렬화 실패로 인해 거래를 재 시도하기 위해 준비해야합니다.
업데이트, 삭제, 업데이트 선택및공유 선택명령은와 동일하게 행동합니다select대상 행 검색 측면에서 : 트랜잭션 시작 시간에 따라 커밋 된 대상 행만 찾을 수 있습니다. 그러나 이러한 대상 행은 발견 될 때까지 다른 동시 거래에 의해 이미 업데이트 (또는 삭제 또는 잠금)되었을 수 있습니다. 이 경우 반복 가능한 읽기 트랜잭션은 첫 번째 업데이트 트랜잭션이 커밋 또는 롤백을 기다릴 때까지 기다립니다 (여전히 진행중인 경우). 첫 번째 업데이트가 롤백되면 그 효과가 부정되고 반복 가능한 읽기 트랜잭션은 원래 발견 된 행을 업데이트 할 수 있습니다. 그러나 첫 번째 업데이트가 커밋하는 경우 (실제로 행을 업데이트하거나 삭제 한 경우) 반복 가능한 읽기 트랜잭션은 메시지와 함께 롤백됩니다
오류 : 동시 업데이트로 인해 액세스를 직렬화 할 수 없습니다
반복 가능한 읽기 트랜잭션은 반복 가능한 읽기 트랜잭션이 시작된 후 다른 트랜잭션에 의해 변경되거나 잠금 행을 수정하거나 잠금 할 수 없기 때문에
응용 프로그램 이이 오류 메시지를 받으면 현재 트랜잭션을 중단하고 처음부터 전체 트랜잭션을 재 시도해야합니다. 두 번째로, 트랜잭션은 이전에 커미셔닝 된 변경을 데이터베이스의 초기보기의 일부로 볼 것이므로 새 버전의 새로운 버전을 새 트랜잭션 업데이트의 시작점으로 사용하는 데 논리적 인 충돌이 없습니다..
거래 만 업데이트하는 것만 재조정해야 할 수도 있습니다. 읽기 전용 거래는 직렬화 충돌이 없습니다.
반복 가능한 읽기 모드는 각 트랜잭션이 데이터베이스의 완전히 안정적인보기를 본다는 엄격한 보증을 제공합니다. 그러나이 견해는 반드시 같은 수준의 동시 트랜잭션의 일부 직렬 (한 번에 하나씩) 실행과 일치하지는 않습니다. 예를 들어,이 수준에서 읽기 전용 거래조차도 배치가 완료되었음을 보여주기 위해 제어 레코드가 업데이트 될 수 있지만not제어 레코드의 이전 개정판을 읽기 때문에 배치의 논리적 인 일부인 세부 레코드 중 하나를 참조하십시오. 이 격리 수준에서 실행되는 거래에 의해 비즈니스 규칙을 시행하려는 시도는 충돌하는 거래를 차단하기 위해 명시 적 잠금 장치를 신중하게 사용하지 않으면 올바르게 작동하지 않을 것입니다.
참고 :이전PostgreSQL버전 9.1, 직렬화 가능한 트랜잭션 격리 수준에 대한 요청은 여기에 설명 된 동일한 동작을 제공했습니다. 레거시 직렬화 가능한 동작을 유지하려면 이제 반복 가능한 읽기가 요청되어야합니다.
theSERIALIZABLE격리 수준은 가장 엄격한 트랜잭션 격리를 제공합니다. 이 수준은 모든 커밋 된 거래에 대한 직렬 거래 실행을 에뮬레이션합니다. 마치 거래가 동시에보다 연속적으로 실행 된 것처럼. 그러나 반복 가능한 읽기 레벨과 마찬가지로이 레벨을 사용하는 응용 프로그램은 직렬화 실패로 인해 트랜잭션을 재 시도 할 준비를해야합니다. 실제로,이 격리 수준은 동시 직렬화 가능한 트랜잭션 세트를 실행할 수있는 조건을 모니터링한다는 점을 제외하고 반복 가능한 읽기와 정확히 동일하게 작동합니다. 이 모니터링은 반복 가능한 읽기로 현재의 차단을 소개하지 않지만 모니터링에 대한 오버 헤드와 A를 유발할 수있는 조건의 탐지가 있습니다.직렬화 이상a 트리거직렬화 실패.
예를 들어 테이블을 고려Mytab, 처음 포함 :
클래스 | 값 -------+------- 1 | 10 1 | 20 2 | 100 2 | 200
직렬화 가능한 트랜잭션이 계산된다고 가정합니다.
mytab에서 sum (value)을 선택하여 클래스 = 1;
그런 다음 결과 (30)을로 삽입합니다.value새 행으로클래스 = 2. 동시에, 직렬화 가능한 트랜잭션 B 계산 :
mytab에서 sum (value)을 선택하여 클래스 = 2;
결과 300을 얻습니다.클래스 = 1. 그런 다음 두 거래 모두 커밋을 시도합니다. 중 하나가 반복 가능한 읽기 격리 수준에서 실행 된 경우 둘 다 커밋 할 수 있습니다. 그러나 결과와 일치하는 일련의 실행 순서가 없기 때문에 직렬화 가능한 트랜잭션을 사용하면 한 트랜잭션이 커밋 할 수 있으며이 메시지로 다른 트랜잭션을 다시 굴립니다.
오류 : 메이저 토토 사이트 간 읽기/쓰기 종속성으로 인해 액세스를 일련화 할 수 없습니다
A가 B 전에 실행 된 경우 B가 300이 아닌 합계 330을 계산했을 것이기 때문에 다른 순서는 A에 의해 다른 합계를 계산했을 것입니다.
이상을 방지하기 위해 직렬화 가능한 트랜잭션에 의존 할 때, 영구 사용자 테이블에서 읽은 데이터는 읽은 트랜잭션이 성공적으로 커밋 된 트랜잭션이 유효하지 않은 것으로 간주되지 않는 것이 중요합니다. 데이터 내에서 읽은 데이터를 제외하고는 읽기 전용 트랜잭션에도 해당됩니다.연기 가능읽기 전용 트랜잭션은 데이터를 읽기 시작하기 전에 그러한 문제가없는 스냅 샷을 얻을 수있을 때까지 기다리기 때문에 읽기가 읽히 자마자 유효한 것으로 알려져 있습니다. 다른 모든 경우에 응용 프로그램은 나중에 중단 된 거래 중에 읽은 결과에 의존해서는 안됩니다. 대신, 그들은 거래가 성공할 때까지 거래를 다시 시도해야합니다.
진정한 직렬화 가능성을 보장하려면PostgreSQL용도술어 잠금, 이는 자물쇠를 유지하여 글이 언제 읽었는지 결정할 수있는시기를 결정할 수있게하여 동시 거래에서 이전 읽기 결과에 먼저 실행되었다는 것을 의미합니다. 안에PostgreSQL이 자물쇠는 차단을 유발하지 않으므로not교착 상태를 일으키는 부분을 재생하십시오. 그것들은 특정 조합에서 직렬화 이상으로 이어질 수있는 동시 직렬화 가능한 트랜잭션 간의 종속성을 식별하고 플래그 의존하는 데 사용됩니다. 대조적으로, 데이터 일관성이 전체 테이블에서 잠금 장치를 꺼내야 할 수있는 읽기 또는 반복 가능한 읽기 트랜잭션은 다른 사용자가 해당 테이블을 사용하려고 시도하는 것을 차단하거나 사용할 수 있습니다.업데이트 선택또는공유 선택다른 메이저 토토 사이트을 차단할 수있을뿐만 아니라 디스크 액세스를 유발할 수 있습니다.
술어 잠금 장치PostgreSQL29002_29123PG_LOCKSa 시스템보기모드ofSireadlock. 쿼리 실행 중에 획득 한 특정 잠금 장치는 쿼리에서 사용하는 계획에 따라 다르며, 메이저 토토 사이트 과정에서 다수의 더 미세한 잠금 장치 (예 : 튜플 잠금 장치)가 더 적은 수의 거친 자물쇠 (예 : 페이지 잠금)로 결합하여 자물쇠를 추적하는 데 사용되는 메모리의 피로를 방지 할 수 있습니다. 에이읽기 전용거래가 완료되기 전에 Siread 잠금 장치를 해제 할 수 있습니다. 충돌이 여전히 발생할 수 없음을 감지하여 직렬화 이상으로 이어질 수 있습니다. 사실은,읽기 전용트랜잭션은 종종 시작시 해당 사실을 확립하고 술어 잠금 장치를 피할 수 있습니다. 명시 적으로 요청하면직렬화 가능한 읽기 전용 연기메이저 토토 사이트은이 사실을 확립 할 수있을 때까지 차단됩니다. (이것은입니다.전용직렬화 가능한 트랜잭션이 차단되지만 반복 가능한 읽기 트랜잭션이 그렇지 않은 경우) 반면에, SIREAD 잠금 장치는 종종 트랜잭션을 넘어서야합니다.
직렬화 가능한 트랜잭션의 일관된 사용은 개발을 단순화 할 수 있습니다. 성공적으로 성공적으로 커밋 된 동시 직렬화 가능한 트랜잭션 세트는 한 번에 하나씩 실행되는 것과 같은 효과를 갖는다는 것은 서면으로 단일 거래가 자체적으로 운영 될 때 올바른 일을 할 수 있음을 입증 할 수 있다는 것을 의미합니다. 다른 트랜잭션이 수행 할 수있는 일에 대한 정보가 없을 수도 있고, 어떤 거래를 수행 할 수 있는지에 대한 정보가 없어도 올바른 일을 할 수 있음을 입증 할 수 있습니다. 이 기술을 사용하는 환경은 직렬화 실패를 처리하는 일반화 된 방법 ( '40001'의 SQLState 값으로 항상 반환)을 갖는 것이 중요합니다. 왜냐하면 어떤 트랜잭션이 읽기/쓰기 종속성에 어떤 영향을 줄 수 있는지 정확히 예측하기가 매우 어렵 기 때문에 직렬화 이상을 방지하기 위해 다시 롤백해야합니다. 읽기/쓰기 종속성의 모니터링에는 직렬화 실패로 종료되는 트랜잭션의 재시작과 마찬가지로 비용이 발생하지만 명시 적 잠금 장치 사용과 관련된 비용 및 차단과 균형을 이룹니다.업데이트 선택또는공유 선택, Serializable Transactions는 일부 환경에서 최고의 성능 선택입니다.
whilePostgreSQL의 직렬화 가능한 트랜잭션 격리 수준은 동시 트랜잭션이 동시 실행 순서가 동일한 효과를 생성하는 일련의 실행 순서가 있음을 증명할 수있는 경우에만 커밋 할 수있게 해주므로, 실제 일련의 실행에서 발생하지 않는 오류가 항상 발생하는 것을 방해하지는 않습니다. 특히, 삽입을 시도하기 전에 키가 존재하지 않는지 명시 적으로 확인한 후에도 겹치는 일련의 트랜잭션과의 충돌로 인한 고유 한 제약 위반을 볼 수 있습니다. 이것은를 확인함으로써 피할 수 있습니다all잠재적으로 충돌하는 키를 먼저 삽입하는 시리얼이 가능한 트랜잭션은 먼저 그렇게 할 수 있는지 명시 적으로 확인하십시오. 예를 들어, 사용자에게 새 키를 요청하는 응용 프로그램을 상상 한 다음 먼저 선택하여 아직 존재하지 않는지 확인하거나 최대 기존 키를 선택하고 추가하여 새 키를 생성합니다. 일부 직렬화 가능한 트랜잭션 이이 프로토콜을 따르지 않고 새 키를 직접 삽입하는 경우, 동시 거래의 일련의 실행에서 발생할 수없는 경우에도 고유 한 제약 위반이보고 될 수 있습니다..
동시성 제어를 위해 직렬화 가능한 트랜잭션에 의존 할 때 최적의 성능을 얻으려면 이러한 문제를 고려해야합니다.
거래 선언으로읽기 전용가능하면.
필요한 경우 연결 풀을 사용하여 활성 연결 수를 제어합니다. 이것은 항상 중요한 성능 고려 사항이지만 직렬화 가능한 트랜잭션을 사용하는 바쁜 시스템에서 특히 중요 할 수 있습니다.
무결성 목적에 필요한 것보다 단일 트랜잭션에 더 많이 넣지 마십시오.
연결을 방해하지 마십시오"메이저 토토 사이트의 유휴"필요한 것보다 길다.
명시 적 잠금 제거,업데이트 선택및공유 선택직렬화 가능한 트랜잭션에 의해 자동으로 제공되는 보호로 인해 더 이상 필요하지 않은 경우.
시스템이 여러 페이지 수준의 술어 잠금을 단일 관계 수준의 술어 잠금 장치로 결합해야 할 때 술어 잠금 테이블이 메모리가 부족하기 때문에 직렬화 실패 속도가 증가 할 수 있습니다. 당신은 증가하여 이것을 피할 수 있습니다max_pred_locks_per_transaction.
순차적 스캔은 항상 관계 수준의 술어 잠금 장치를 필요로합니다. 이로 인해 직렬화 실패 속도가 증가 할 수 있습니다. 줄임으로써 인덱스 스캔 사용을 장려하는 것이 도움이 될 수 있습니다random_page_cost및/또는 증가CPU_TUPLE_COST. 메이저 토토 사이트 롤백의 감소와 쿼리 실행 시간의 전반적인 변경에 비해 다시 시작하십시오.