다음을 통해 공유


커서 및 준비된 명령문에 트랜잭션이 미치는 영향

트랜잭션 커밋 또는 롤백은 커서 및 액세스 계획에 다음과 같은 영향을 줍니다.

  • 모든 커서가 닫히고 해당 연결에서 준비된 문에 대한 액세스 계획이 삭제되거나

  • 모든 커서가 닫히고 해당 연결의 준비된 문에 대한 액세스 계획이 그대로 기본 또는

  • 모든 커서가 다시 열려 기본 해당 연결에서 준비된 문에 대한 액세스 계획은 그대로 기본.

예를 들어 데이터 원본이 이 목록의 첫 번째 동작을 가장 제한적으로 표시한다고 가정합니다. 이제 애플리케이션이 다음을 수행한다고 가정합니다.

  1. 커밋 모드를 수동 커밋으로 설정합니다.

  2. 문 1에 판매 주문의 결과 집합을 만듭니다.

  3. 사용자가 해당 주문을 강조 표시할 때 문 2의 판매 주문에 선의 결과 집합을 만듭니다.

  4. SQLExecute를 호출하여 사용자가 줄을 업데이트할 때 문 3에서 준비된 위치 지정 업데이트 문을 실행합니다.

  5. SQLEndTran을 호출하여 배치된 업데이트 문을 커밋합니다.

데이터 원본의 동작으로 인해 5단계에서 SQLEndTran을 호출하면 문 1과 2의 커서를 닫고 모든 문에서 액세스 계획을 삭제합니다. 애플리케이션은 문 1과 2를 다시 테스트하여 결과 집합을 다시 만들고 문 3에서 문을 다시 준비해야 합니다.

자동 커밋 모드에서 SQLEndTran 커밋 트랜잭션 이외의 함수:

  • SQLExecute 또는 SQLExecDirect 이전 예제에서 4단계에서 SQLExecute에 대한 호출은 트랜잭션을 커밋합니다. 이렇게 하면 데이터 원본이 문 1과 2의 커서를 닫고 해당 연결의 모든 문에서 액세스 계획을 삭제합니다.

  • SQLBulkOperations 또는 SQLSetPos 앞의 예제에서 4단계에서 애플리케이션이 문 3에 배치된 업데이트 문을 실행하는 대신 문 2의 SQL_UPDATE 옵션을 사용하여 SQLSetPos를 호출한다고 가정합니다. 이렇게 하면 트랜잭션이 커밋되고 데이터 원본이 문 1과 2의 커서를 닫고 해당 연결에 대한 모든 액세스 계획을 카드 않습니다.

  • 앞의 예제에서 사용자가 다른 판매 주문을 강조 표시할 때 애플리케이션은 새 판매 주문에 대한 줄의 결과를 만들기 전에 문 2에서 SQLCloseCursor를 호출한다고 가정합니다. SQLCloseCursor에 대한 호출은 결과 줄 집합을 만든 SELECT 문을 커밋하고 데이터 원본이 문 1에서 커서를 닫은 다음 해당 연결에 대한 모든 액세스 계획을 카드 않습니다.

애플리케이션, 특히 사용자가 결과 집합을 스크롤하여 행을 업데이트하거나 삭제하는 화면 기반 애플리케이션은 이 동작을 중심으로 코딩하는 데 주의해야 합니다.

트랜잭션이 커밋되거나 롤백될 때 데이터 원본이 동작하는 방식을 결정하기 위해 애플리케이션은 SQL_CURSOR_COMMIT_BEHAVIOR 및 SQL_CURSOR_ROLLBACK_BEHAVIOR 옵션을 사용하여 SQLGetInfo를 호출합니다.