다음을 통해 공유


트랜잭션 클라이언트 만들기

트랜잭션 클라이언트는 리소스 관리자의 내보낸 인터페이스를 사용하여 리소스 관리자가 지원하는 데이터베이스와 같은 리소스에 액세스하는 TPS(트랜잭션 처리 시스템) 구성 요소입니다.

일반적으로 클라이언트는 트랜잭션을 만들고 데이터베이스 작업 집합을 수행한 다음 트랜잭션을 커밋하여 작업을 영구적으로 만듭니다. 클라이언트에 오류가 발생하면 트랜잭션을 커밋하는 대신 트랜잭션의 작업을 제거하기 위해 트랜잭션을 롤백할 수 있습니다.

일반적으로 커널 모드 KTM을 사용하는 트랜잭션 클라이언트는 각 트랜잭션에 대해 다음 작업을 수행해야 합니다.

  1. 트랜잭션 개체를 만듭니다.

    ZwCreateTransaction에 대한 호출은 트랜잭션 개체를 만들고, 개체 핸들을 제공하고, 클라이언트가 리소스 관리자에 전달하여 트랜잭션을 식별할 수 있는 개체 식별자(GUID)를 할당합니다.

  2. 트랜잭션 개체의 식별자를 가져옵니다.

    클라이언트는 ZwQueryInformationTransaction 을 호출하여 개체 식별자를 가져올 수 있습니다.

  3. 트랜잭션 개체의 식별자를 리소스 관리자에 전달합니다.

    클라이언트는 일반적으로 리소스 관리자의 내보낸 인터페이스를 호출하여 리소스 관리자에 대한 통신 경로를 열고 경로를 트랜잭션과 연결합니다. 예를 들어 리소스 관리자는 TPS 구성 요소 이해 항목에서 설명하는 것과 유사한 CreateDataObject 루틴을 제공할 수 있습니다.

  4. 트랜잭션에 포함할 작업을 수행합니다.

    일반적으로 클라이언트는 리소스 관리자의 인터페이스를 호출하여 리소스 관리자의 리소스에 액세스합니다. 예를 들어 데이터베이스 관리자의 클라이언트는 데이터베이스에서 읽고 데이터베이스에 쓸 수 있습니다.

  5. 트랜잭션을 커밋하거나 롤백합니다.

    모든 리소스 작업이 성공하면 클라이언트는 ZwCommitTransaction 을 호출하여 작업을 영구적으로 만들어야 합니다. 작업이 실패하면 클라이언트는 ZwCommitTransaction 대신 ZwRollbackTransaction을 호출해야 합니다. 예를 들어 데이터베이스 관리자의 클라이언트가 일련의 쓰기 작업 중 하나가 실패했다고 판단하는 경우 클라이언트는 쓰기 작업이 영구적으로 수행되지 않도록 ZwRollbackTransaction 을 호출해야 합니다.

    클라이언트는 ZwCommitTransactionZwRollbackTransaction 을 동기 또는 비동기적으로 호출할 수 있습니다. 클라이언트가 이러한 루틴을 동기적으로 호출하는 경우 커밋 또는 롤백 작업이 완료될 때까지 루틴이 반환되지 않습니다.

    트랜잭션을 커밋하고 롤백하는 방법에 대한 자세한 내용은 트랜잭션 작업 처리를 참조하세요.

  6. 트랜잭션 개체 핸들을 닫습니다.

    클라이언트가 트랜잭션 처리를 완료한 후 ZwClose 를 호출하여 트랜잭션 개체의 핸들을 닫아야 합니다.

TPS에는 둘 이상의 리소스 관리자가 포함될 수 있습니다. 클라이언트의 트랜잭션에 두 리소스 관리자가 지원하는 두 개의 데이터베이스와 같은 여러 리소스에 대한 작업이 포함된 경우 클라이언트는 일반적으로 다음을 수행합니다.

  1. 각 트랜잭션에 대해 단일 트랜잭션 개체를 만듭니다.

  2. 트랜잭션 개체의 식별자를 각 리소스 관리자에 전달합니다.

  3. 각 리소스 관리자의 인터페이스를 호출하여 각 데이터베이스에 대한 작업을 수행합니다.

  4. 모든 작업이 오류 없이 완료된 경우 트랜잭션을 커밋하거나 오류가 감지되면 트랜잭션을 롤백합니다.

TPS에 우수한 트랜잭션 관리자가 포함된 경우 트랜잭션 클라이언트는 일반적으로 KTM을 호출하지 않습니다. 우수한 트랜잭션 관리자 및 해당 클라이언트에 대한 자세한 내용은 우수한 트랜잭션 관리자 만들기를 참조하세요.

트랜잭션 클라이언트는 ZwSetInformationTransaction 을 호출하여 트랜잭션 관련 정보를 설정할 수 있습니다. 예를 들어 클라이언트는 트랜잭션에 대한 제한 시간 값을 설정하거나 설명 문자열을 제공할 수 있습니다. 클라이언트는 ZwQueryInformationTransaction 을 호출하여 트랜잭션에 대한 정보를 검색할 수 있습니다. 예를 들어 클라이언트는 이 루틴을 호출하여 트랜잭션이 커밋되었는지 또는 롤백되었는지 확인할 수 있습니다.