현재 커미트된 시맨틱

현재 커미트된 시맨틱에서는 커미트된 데이터만 판독기로 리턴됩니다. 그러나 판독기는 기록기가 행 잠금을 해제하기를 기다리지 않습니다. 대신, 판독기가 현재 커미트된 버전의 데이터를 기반으로 데이터를 리턴합니다(즉, 쓰기 조작 시작 전의 데이터 버전).

행 레벨 잠금, 특히 해당 문제를 예방하기 위해 디자인되지 않은 애플리케이션의 커서 안정성(CS) 격리 레벨에서 잠금 시간종료 및 교착 상태가 발생할 수 있습니다. 몇몇 높은 처리량이 있는 데이터베이스 애플리케이션에서는 트랜잭션 처리 동안 발행된 잠금에 대한 대기를 허용할 수 없습니다. 또한 몇몇 애플리케이션에서는 커미트되지 않은 데이터의 처리를 허용할 수 없지만 읽기 트랜잭션에 대한 비블로킹 동작이 여전히 필요합니다.

현재 커미트된 시맨틱은 새 데이터베이스에 대해 기본적으로 켜집니다. 애플리케이션에서 새 동작을 이용할 수 있도록 변경할 필요가 없습니다. 기본 동작을 대체하려면 cur_commit 데이터베이스 구성 매개변수를 DISABLED로 설정하십시오. 예를 들어, 애플리케이션에 내부 논리를 동기화하기 위해 기록기에 대한 블로킹이 필요한 경우에는 동작 겹쳐쓰기가 유용할 수도 있습니다. 데이터베이스를 V9.5 또는 이전 버전에서 업그레이드하는 동안 cur_commit 구성 매개변수는 DISABLED로 설정되어 이전 릴리스와 동일한 동작을 유지합니다. 현재 커미트된 커서 안정성 스캔을 사용하려면 업그레이드 후에 cur_commit 구성 매개변수를 ON으로 설정해야 합니다.

현재 커미트된 시맨틱은 제한조건을 평가하거나 강제 적용하는 데 사용되는 내부 스캔 및 카탈로그 테이블과 관련되지 않은 읽기 전용 스캔에만 적용됩니다. 현재 커미트된 시맨틱이 스캔 레벨에서 결정되므로, 기록기의 액세스 플랜에 현재 커미트된 스캔을 포함할 수도 있습니다. 예를 들어, 읽기 전용 서브쿼리에 대한 스캔이 현재 커미트된 시맨틱을 포함할 수 있습니다.

현재 커미트된 시맨틱은 격리 레벨 시맨틱을 따르기 때문에, 현재 커미트된 시맨틱 하에서 실행되는 애플리케이션은 계속해서 격리 레벨을 준수합니다.

현재 커미트된 시맨틱은 기록기용으로 증가된 로그 공간을 필요로 합니다. 트랜잭션 동안 데이터 행의 첫 번째 갱신을 로깅하기 위해 추가 스페이스가 필요합니다. 이 데이터는 행의 현재 커미트된 이미지를 검색하는 데 필요합니다. 워크로드에 따라, 이것은 사용되는 전체 로그 공간에 대수롭지 않은 영향을 미치거나 상당한 영향을 미칠 수 있습니다. cur_commit 데이터베이스 구성 매개변수가 DISABLED로 설정되면 추가 로그 공간에 대한 요구사항은 적용되지 않습니다.

현재 커미트된 시맨틱에서 실행 중인 애플리케이션은 커미트되지 않은 삽입을 항상 무시합니다. 자세한 내용은 커미트되지 않은 삽입을 무시하기 위한 옵션 또는 ../../com.ibm.db2.luw.admin.regvars.doc/doc/r0005665.html 을 참조하십시오.

제한사항

다음 제한사항이 현재 커미트된 시맨틱에 적용됩니다.
  • 데이터 갱신 또는 삭제 조작에 사용되는 섹션의 대상 테이블 오브젝트는 현재 커미트된 시맨틱을 사용하지 않습니다. 수정될 행은 갱신 조작의 일부인 쿼리 술어를 만족한 후에 변경되지 않도록 잠금 보호되어야 합니다.
  • 행에 커미트되지 않은 수정을 수행하는 트랜잭션은 현재 커미트된 판독기가 적합한 로그 레코드에 액세스하여 현재 커미트된 버전의 행을 판별하도록 합니다. 더 이상 로그 버퍼에 없는 로그 레코드를 실제로 읽을 수 있는 경우에도 현재 커미트된 시맨틱은 로그 아카이브에서 로그 파일의 검색을 지원하지 않습니다. 이는 무한 로깅을 사용하도록 구성하는 데이터베이스에만 영향을 미칩니다.
  • 다음 스캔은 현재 커미트된 시맨틱을 사용하지 않습니다.
    • 카탈로그 테이블 스캔. 현재 커미트된 시맨틱은 제한조건을 평가하거나 강제 적용하는 데 사용되는 내부 스캔과 관련되지 않은 읽기 전용 스캔에만 적용됩니다. 현재 커미트는 카탈로그 테이블의 내부 스캔에 적용되지 않지만 레지스트리 변수 DB2COMPOPTLOCKAVOID_EXT_CATSCANS(으)로 설정된 경우 카탈로그 테이블의 외부 스캔에 적용될 수 있습니다.
    • 참조 무결성 제한조건을 강제 적용하는 데 사용되는 스캔
    • LONG VARCHAR 또는 LONG VARGRAPHIC 컬럼을 참조하는 스캔
    • RCT(range-clustered table) 스캔
    • 공간 또는 확장 인덱스를 사용하는 스캔
  • (애플리케이션 충돌이나 예기치 않은 트랜잭션 또는 리소스 관리자 중단으로 인해) 인다우트 트랜잭션이 발생하는 경우 이 인다우트 트랜잭션에 의해 잠겼던 모든 행은 인다우트 트랜잭션이 해결될 때까지 잠긴 상태로 유지됩니다. 이 시간 동안, 현재 커미트된 판독기는 인다우트 트랜잭션에서 이전에 현재 커미트된 시맨틱을 충돌 또는 중단 전에 사용한 경우에만 이러한 행의 현재 커미트된 버전을 읽을 수 있습니다. 그렇지 않은 경우, 현재 커미트된 판독기는 이러한 행을 읽기 전에 인다우트 트랜잭션이 해결될 때까지(그리고 이러한 잠금이 해제될 때까지) 기다립니다.
  • Db2®pureScale® 환경에서는 현재 커미트된 시맨틱이 모든 멤버의 애플리케이션에 적용됩니다. 행 판독기에서 원격 멤버의 애플리케이션이 갱신 또는 삭제 중인 행에 액세스하려고 시도하는 경우 로컬 멤버가 원격 멤버로부터 현재 커미트된 행 데이터를 검색합니다. 그러나 다음과 같은 제한사항이 있습니다.
    • 원격 멤버가 작동 중지되었거나 멤버 응급 복구를 수행 중인 경우 현재 커미트된 시맨틱이 적용되지 않습니다. 행 판독기는 행을 읽어들이기 전에 원격 멤버에서 멤버 응급 복구가 완료되고 잠금이 해제될 때까지 대기합니다.
    • 현재 커미트된 행 데이터를 검색하려고 시도할 때 원격 멤버에 대한 통신이 실패하는 경우 현재 커미트된 시맨틱이 적용되지 않습니다. 행 판독기는 행을 읽어들이기 전에 잠금이 해제될 때까지 대기합니다.
    • 행 판독기의 통신이 도달하기 전에 원격 멤버의 행을 갱신 또는 삭제하는 트랜잭션이 커미트되거나 롤백된 경우 행 판독기에서 해당 행을 다시 읽어들이려고 시도합니다. 이 시점에 다른 원격 멤버의 트랜잭션으로 인해 해당 행이 갱신 또는 삭제되는 경우 행 판독기에서 다시 해당 멤버로부터 현재 커미트된 행 데이터를 검색하려고 시도합니다. 특정 횟수만큼 시도한 후에는 행 판독기에서 포기하고 행 데이터를 읽어들이기 전에 잠금이 해제될 때까지 대기합니다.

모니터링

현재 커미트된 행 데이터 검색은 db2pd -tcbstats 옵션을 통해 테이블 단위로 모니터링할 수 있습니다. ../../com.ibm.db2.luw.admin.cmd.doc/doc/r0011729.html에서 CCLogReads, CCRemoteReqs, CCLockWaitsCCRemRetryLckWs 값을 참조하십시오.

예:

예 1:
현재 커미트된 시맨틱을 사용하여 교착 상태가 회피되는 다음 시나리오를 고려하십시오. 이 시나리오에서는 1단계에 표시된 대로 두 개의 애플리케이션이 두 개의 개별 테이블을 갱신하지만, 아직 커미트하지는 않습니다. 그런 다음, 각 애플리케이션은 2단계에 표시된 대로 읽기 전용 커서를 사용하여 다른 애플리케이션이 업데이트한 테이블에서 읽으려고 시도합니다. 이러한 애플리케이션은 CS 격리 레벨에서 실행됩니다.
단계 애플리케이션 A 애플리케이션 B
1 update T1 set col1 = ? where col2 = ? update T2 set col1 = ? where col2 = ?
2 select col1, col3, col4 from T2 where col2 >= ? select col1, col5, from T1 where col5 = ? and col2 = ?
3 commit commit
현재 커미트된 시맨틱이 없을 경우, 커서 안정성 격리 레벨 하에서 실행되는 이러한 애플리케이션은 애플리케이션 중 하나가 실패하게 하는 교착 상태를 만들 수도 있습니다. 각 애플리케이션에서 다른 애플리케이션에 의해 갱신 중인 데이터를 읽어야 할 경우 이 상황이 발생할 수 있습니다.

현재 커미트된 시맨틱 하에서는 2단계의 쿼리에서 실행 중인 애플리케이션 중 하나가 다른 애플리케이션에 의해 갱신 중인 데이터를 필요로 하는 경우, 첫 번째 애플리케이션이 잠금이 해제되기를 기다리지 않습니다. 그 결과, 교착 상태가 불가능합니다. 대신, 첫 번째 애플리케이션이 이전에 커미트된 버전의 데이터를 배치하여 사용합니다.

예 2
Db2®pureScale® 환경에서 애플리케이션이 잠금 대기 조건을 방지하는 다음 시나리오를 고려하십시오. 테이블 T1에서 멤버 1의 애플리케이션-A가 갱신되었지만 해당 변경사항이 아직 커미트되지 않았으며 멤버 1(애플리케이션-A와 동일한 멤버) 또는 멤버 2(애플리케이션-B와 다른 멤버)의 애플리케이션-B가 커서 안정성 격리 레벨을 사용하여 해당 데이터를 읽어들이려고 시도합니다.
단계 pureScale 멤버 1의 애플리케이션-A pureScale 멤버의 애플리케이션-B
1 update T1 set col1 = 12where col2 = ‘Ava’  
2   select col1 from T1 where col2 = ‘Ava’
3 commit  

현재 커미트된 시맨틱이 없는 경우 애플리케이션-B는 데이터를 읽어들이기 전에 애플리케이션-A가 해당 갱신을 커미트하고 행 잠금이 해제될 때까지 대기해야 합니다. 현재 커미트된 시맨틱의 경우 애플리케이션-B가 이전에 커미트된 버전의 데이터를 대신 사용합니다.