다음을 통해 공유


트랜잭션 커밋 및 롤백

수동 커밋 모드에서 트랜잭션을 커밋하거나 롤백하기 위해 애플리케이션은 SQLEndTran을 호출합니다. 트랜잭션을 지원하는 DBMS용 드라이버는 일반적으로 COMMIT 또는 ROLLBACK 문을 실행하여 이 함수를 구현합니다. 드라이버 관리자는 연결이 자동 커밋 모드일 때 SQLEndTran을 호출하지 않습니다. 애플리케이션이 트랜잭션을 롤백하려고 하더라도 단순히 SQL_SUCCESS 반환합니다. 트랜잭션을 지원하지 않는 DBMS용 드라이버는 항상 자동 커밋 모드이므로 아무 작업도 수행하지 않고 SQL_SUCCESS 반환하도록 SQLEndTran을 구현하거나 전혀 구현하지 않을 수 있습니다.

참고 항목

애플리케이션은 SQLExecute 또는 SQLExecDirect를 사용하여 COMMIT 또는 ROLLBACK 문을 실행하여 트랜잭션을 커밋하거나 롤백해서는 안 됩니다. 이 작업을 수행하는 효과는 정의되지 않습니다. 가능한 문제에는 트랜잭션이 활성화된 시기를 더 이상 알지 못하는 드라이버와 트랜잭션을 지원하지 않는 데이터 원본에 대해 오류가 발생하는 문이 포함됩니다. 이러한 애플리케이션은 SQLEndTran을 대신 호출해야 합니다.

애플리케이션이 환경 핸들을 SQLEndTran전달하지만 연결 핸들을 전달하지 않는 경우 드라이버 관리자는 환경에서 하나 이상의 활성 연결이 있는 각 드라이버에 대한 환경 핸들을 사용하여 SQLEndTran을 개념적으로 호출합니다. 그런 다음 드라이버는 환경의 각 연결에서 트랜잭션을 커밋합니다. 그러나 드라이버와 드라이버 관리자가 환경의 연결에 대해 2단계 커밋을 수행하지 않는다는 사실을 깨닫는 것이 중요합니다. 이는 환경의 모든 연결에 대해 SQLEndTran을 동시에 호출하는 프로그래밍 편의에 불과합니다.

(2단계 커밋은 일반적으로 여러 데이터 원본에 분산된 트랜잭션을 커밋하는 데 사용됩니다. 첫 번째 단계에서 데이터 원본은 트랜잭션의 해당 부분을 커밋할 수 있는지 여부에 대해 폴링됩니다. 두 번째 단계에서 트랜잭션은 실제로 모든 데이터 원본에서 커밋됩니다. 데이터 원본이 트랜잭션을 커밋할 수 없는 첫 번째 단계에서 회신하는 경우 두 번째 단계는 발생하지 않습니다.)