격리 레벨 지정

격리 레벨은 데이터가 액세스되는 동안 데이터가 다른 프로세스에서 격리되는 방법을 판별하므로, 데이터 무결성과 동시성 요구사항의 균형을 맞추는 격리 레벨을 선택해야 합니다.

이 타스크에 대한 정보

지정하는 격리 레벨은 작업 단위(UOW)의 지속기간 동안 적용됩니다. SQL 또는 XQuery문을 컴파일할 때 어떤 격리 레벨이 사용되는지 판별하는 데 다음 발견적 방법이 사용됩니다.
  • 정적 SQL의 경우:
    • 명령문에서 isolation-clause가 지정된 경우, 해당 절의 값이 사용됩니다.
    • 명령문에서 isolation-clause가 지정되지 않은 경우, 패키지가 데이터베이스에 바인드될 때 패키지에 대해 지정된 격리 레벨이 사용됩니다.
  • 동적 SQL의 경우:
    • 명령문에서 isolation-clause가 지정된 경우, 해당 절의 값이 사용됩니다.
    • 명령문에서 isolation-clause가 지정되어 있지 않고 현재 세션 내에서 SET CURRENT ISOLATION문이 발행된 경우, CURRENT ISOLATION 특수 레지스터의 값이 사용됩니다.
    • 명령문에 isolation-clause가 지정되어 있지 않고 현재 세션 내에서 SET CURRENT ISOLATION문이 발행되지 않은 경우, 패키지가 데이터베이스에 바인드될 때 패키지에 대해 지정된 격리 레벨이 사용됩니다.
  • 정적 또는 동적 XQuery문의 경우, 환경의 격리 레벨이 XQuery 표현식이 평가될 때 사용되는 격리 레벨을 결정합니다.
주: 상업적으로 작성된 많은 응용프로그램은 분리 레벨을 선택하는 방법을 제공합니다. 자세한 내용은 애플리케이션 문서를 참조하십시오.

격리 레벨은 여러 다양한 방법으로 지정할 수 있습니다.

프로시저

  • 명령문 또는 부속 선택 레벨에서:
    참고: XQuery문의 분리 레벨은 명령문 레벨에서 지정할 수 없습니다.

    WITH절을 사용하십시오. WITH UR 옵션은 읽기 전용 조작에만 적용됩니다. 기타 경우에는, 명령문이 자동으로 UR에서 CS로 변경됩니다.

    이 격리 레벨은 명령문이 나타나는 패키지에 대해 지정된 격리 레벨을 겹쳐씁니다. 다음 SQL문에 대한 격리 레벨을 지정할 수 있습니다.
    • DECLARE CURSOR
    • 검색된 DELETE
    • INSERT
    • SELECT
    • SELECT INTO
    • 검색된 UPDATE
  • 현재 세션 내의 동적 SQL의 경우:

    SET CURRENT ISOLATION문을 사용하여 세션 내 발행된 동적 SQL에 대한 격리 레벨을 설정하십시오. 이 명령문을 발행하면 CURRENT ISOLATION 특수 레지스터가 현재 세션 내에서 발행된 동적 SQL문에 대한 격리 레벨을 지정하는 값으로 설정됩니다. 일단 설정되면, CURRENT ISOLATION 특수 레지스터는 어떤 패키지에서 명령문을 발행했든지 상관없이, 세션 내에서 컴파일 된 후속 동적 SQL문에 대한 격리 레벨을 제공합니다. 이 격리 레벨은 세션이 종료되거나 SET CURRENT ISOLATION ...RESET문이 발행될 때까지 유효합니다.

  • 프리컴파일 또는 바인드 시:

    지원되는 컴파일된 언어로 작성된 애플리케이션의 경우, PREP 또는 BIND 명령의 ISOLATION 옵션을 사용하십시오. 또한 sqlaprep 또는 sqlabndx API를 사용하여 격리 레벨을 지정할 수 있습니다.

    • 프리컴파일 시간에 바인드 파일을 작성할 경우, 격리 레벨이 바인드 파일에 저장됩니다. 바인드 시간에 격리 레벨을 지정하지 않을 경우, 기본값은 프리컴파일 동안 사용된 격리 레벨입니다.
    • 격리 레벨을 지정하지 않을 경우, 커서 안정성(CS)의 기본 레벨이 사용됩니다.
    패키지의 격리 레벨을 판별하려면, 다음 쿼리를 실행하십시오.
    select isolation from syscat.packages
      where pkgname = 'pkgname'
        and pkgschema = 'pkgschema'
    여기서 pkgname은 패키지의 규정되지 않은 이름이고 pkgschema는 패키지의 스키마 이름입니다. 이러한 이름은 둘 다 대문자로 지정되어야 합니다.
  • 런타임 시 JDBC 또는 SQLJ에 대해 작업하는 경우:
    참고: JDBC 및 SQLJ는 Db2® 서버에서 CLI를 사용하여 구현됩니다. 이는 db2cli.ini 설정이 JDBC 및 SQLJ를 사용하여 작성되고 실행되는 내용에 영향을 줄 수 있음을 의미합니다.

    SQLJ에서 패키지를 작성하려면(그리고 해당 격리 레벨 지정), SQLJ 프로파일 사용자 정의 프로그램(db2sqljcustomize 명령)을 사용하십시오.

  • 런타임 시 CLI 또는 ODBC 에서:

    다음 CHANGE ISOLATION LEVEL 명령을 사용하십시오. DB2 콜 레벨 인터페이스(CLI)를 사용하여 CLI 구성의 일부로 격리 레벨을 변경할 수 있습니다. 런타임에서, SQL_ATTR_TXN_ISOLATION 속성과 함께 SQLSetConnectAttr 기능을 사용하여 ConnectionHandle 인수에 의해 참조되는 현재 연결에 대한 트랜잭션 격리 레벨을 설정하십시오. db2cli.ini 파일에서 TXNISOLATION 키워드를 사용할 수도 있습니다.

  • REXX를 지원하는 데이터베이스 서버의 경우:

    데이터베이스가 작성되면 REXX의 SQL에 대해 서로 다른 분리 레벨을 지원하는 여러 바인드 파일이 데이터베이스에 바인드됩니다. 다른 명령행 처리기(CLP) 패키지 또한 데이터베이스가 작성될 때 데이터베이스에 바인드됩니다.

    REXX및 CLP는 기본 CS 분리 레벨을 사용하여 데이터베이스에 연결합니다. 이 격리 레벨을 변경해도 연결 상태가 변경되지 않습니다.

    REXX 애플리케이션에서 사용 중인 격리 레벨을 판별하려면 SQLISL 사전 정의된 REXX 변수의 값을 확인하십시오. 이 값은 CHANGE ISOLATION LEVEL 명령이 실행될 때마다 갱신됩니다.

  • 새 세션에 사용되는 기본 분리 레벨 변경:
    새 세션에서 동적 SQL에 사용되는 일반 기본 격리 레벨은 해당 세션에서 사용되는 패키지의 격리 레벨에 의해 결정됩니다. 애플리케이션이 처리 중에 이 값을 변경할 수 있는 동안 데이터베이스 관리자는 다음을 구현하여 애플리케이션 외부의 기본 격리 수준을 변경할 수도 있습니다.