SQLEndTran 함수

규칙
도입된 버전: ODBC 3.0 표준 준수: ISO 92

요약
SQLEndTran 은 연결과 연결된 모든 문에 대한 모든 활성 작업에 대한 커밋 또는 롤백 작업을 요청합니다. SQLEndTran 은 환경과 연결된 모든 연결에 대해 커밋 또는 롤백 작업을 수행되도록 요청할 수도 있습니다.

참고 항목

드라이버 관리자가 이 함수를 ODBC 3에 매핑하는 항목에 대한 자세한 내용을 보려면x 애플리케이션이 ODBC 2에서 작동합니다.x 드라이버는 애플리케이션의 이전 버전과의 호환성을 위한 대체 함수 매핑을 참조 하세요.

구문

  
SQLRETURN SQLEndTran(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle,  
     SQLSMALLINT   CompletionType);  

인수

HandleType
[입력] 형식 식별자를 처리합니다. SQL_HANDLE_ENV(핸들이 환경 핸들인 경우) 또는 SQL_HANDLE_DBC(Handle이 연결 핸들인 경우)을 포함합니다.

Handle
[입력] 트랜잭션 범위를 나타내는 HandleType으로 표시된 형식의 핸들입니다. 자세한 내용은 "주석"을 참조하세요.

CompletionType
[입력] 다음 두 값 중 하나입니다.

SQL_COMMIT SQL_ROLLBACK

반품

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE 또는 SQL_STILL_EXECUTING.

진단

SQLEndTran이 SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO 반환하는 경우 적절한 HandleTypeHandle을 사용하여 SQLGetDiagRec를 호출하여 연결된 SQLSTATE 값을 가져올 수 있습니다. 다음 표에서는 SQLEndTran에서 일반적으로 반환되는 SQLSTATE 값을 나열하고 이 함수의 컨텍스트에서 각 값을 설명합니다. 표기법 "(DM)"은 드라이버 관리자가 반환한 SQLSTATE에 대한 설명 앞에 나와 있습니다. 달리 명시되지 않는 한 각 SQLSTATE 값과 연결된 반환 코드는 SQL_ERROR.

SQLSTATE Error 설명
01000 일반 경고 드라이버 관련 정보 메시지입니다. 함수는 SQL_SUCCESS_WITH_INFO 반환합니다.
08003 연결이 열리지 않음 (DM) HandleType이 SQL_HANDLE_DBC 핸들연결된 상태가 아닙니다.
08007 트랜잭션 중 연결 실패 HandleType이 SQL_HANDLE_DBC 함수를 실행하는 동안 Handle연결된 연결이 실패했으며 요청된 COMMIT 또는 ROLLBACK이 실패하기 전에 발생했는지 여부를 확인할 수 없습니다.
25S01 트랜잭션 상태를 알 수 없음 Handle의 연결 중 하나 이상이 지정된 결과로 트랜잭션을 완료하지 못했으며 결과를 알 수 없습니다.
25S02 트랜잭션이 여전히 활성 상태입니다. 드라이버는 전역 트랜잭션의 모든 작업을 원자성으로 완료할 수 있으며 트랜잭션이 여전히 활성 상태임을 보장할 수 없습니다.
25S03 트랜잭션 롤백 드라이버가 전역 트랜잭션의 모든 작업을 원자성으로 완료할 수 있음을 보장할 수 없으며 Handle에서 활성 상태인 트랜잭션의 모든 작업이 롤백되었습니다.
40001 Serialization 실패 다른 트랜잭션과의 리소스 교착 상태 때문에 트랜잭션이 롤백되었습니다.
40002 무결성 제약 조건 위반 CompletionTypeSQL_COMMIT 변경 약정으로 인해 무결성 제약 조건 위반이 발생했습니다. 결과적으로 트랜잭션이 롤백되었습니다.
HY000 일반 오류 특정 SQLSTATE가 없고 구현별 SQLSTATE가 정의되지 않은 오류가 발생했습니다. *szMessageText 버퍼의 SQLGetDiagRec에서 반환된 오류 메시지는 오류와 그 원인을 설명합니다.
HY001 메모리 할당 오류 드라이버가 함수 실행 또는 완료를 지원하는 데 필요한 메모리를 할당할 수 없습니다.
HY008 작업이 취소됨 ConnectionHandle에 대해 비동기 처리를 사용하도록 설정했습니다. 함수가 호출되었고 SQLCancelHandle 함수 실행을 완료하기 전에 ConnectionHandle에서 호출되었습니다. 그런 다음 ConnectionHandle에서 함수가 다시 호출되었습니다.

함수가 호출되었고 SQLCancelHandle 실행을 완료하기 전에 다중 스레드 애플리케이션의 다른 스레드에서 ConnectionHandle에서 호출되었습니다.
HY010 함수 시퀀스 오류 (DM) ConnectionHandle연결된 문 핸들에 대해 비동기적으로 실행되는 함수가 호출되었으며 SQLEndTran이 호출될 때 계속 실행되고 있었습니다.

(DM) ConnectionHandle에 대해 비동기 실행 함수(이 함수가 아님)가 호출되었고 이 함수가 호출되었을 때 계속 실행되고 있었습니다.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations 또는 SQLSetPos는 ConnectionHandle연결된 문 핸들에 대해 호출되고 SQL_NEED_DATA 반환되었습니다. 이 함수는 모든 실행 시 데이터 매개 변수 또는 열에 대한 데이터를 보내기 전에 호출되었습니다.

(DM) HandleType이 SQL_HANDLE_DBC 설정된 Handle 에 대해 비동기 실행 함수(이 함수가 아님)가 호출되었으며 이 함수가 호출되었을 때 계속 실행되고 있었습니다.

(DM) SQLExecute, SQLExecDirect 또는 SQLMoreResults는 Handle연결된 문 핸들 중 하나에 대해 호출되고 반환된 SQL_PARAM_DATA_AVAILABLE. 이 함수는 모든 스트리밍된 매개 변수에 대해 데이터를 검색하기 전에 호출되었습니다.
HY012 잘못된 트랜잭션 작업 코드 (DM) CompletionType 인수에 지정된 값이 SQL_COMMIT SQL_ROLLBACK 않았습니다.
HY013 메모리 관리 오류 메모리 조건이 낮기 때문에 기본 메모리 개체에 액세스할 수 없기 때문에 함수 호출을 처리할 수 없습니다.
HY092 잘못된 특성/옵션 식별자 (DM) HandleType 인수에 지정된 값이 SQL_HANDLE_ENV SQL_HANDLE_DBC 않았습니다.
HY115 비동기 함수 실행을 사용하도록 설정된 연결이 포함된 환경에는 SQLEndTran이 허용되지 않습니다. (DM) 환경에서 연결에 대해 연결 함수의 비동기 실행을 사용하는 경우 HandleType 을 SQL_HANDLE_ENV 설정할 수 없습니다.
HY117 알 수 없는 트랜잭션 상태로 인해 연결이 일시 중단됩니다. 연결 끊기 및 읽기 전용 함수만 허용됩니다. (DM) 일시 중단 상태에 대한 자세한 내용은 이 항목의 설명 섹션을 참조하세요.
HYC00 선택적 기능이 구현되지 않음 드라이버 또는 데이터 원본은 ROLLBACK 작업을 지원하지 않습니다.
HYT01 연결 제한 시간이 만료됨 데이터 원본이 요청에 응답하기 전에 연결 제한 시간이 만료되었습니다. 연결 제한 시간은 SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr를 통해 설정됩니다.
IM001 드라이버는 이 함수를 지원하지 않습니다. (DM) ConnectionHandle연결된 드라이버는 함수를 지원하지 않습니다.
IM017 비동기 알림 모드에서 폴링을 사용할 수 없습니다. 알림 모델을 사용할 때마다 폴링이 비활성화됩니다.
IM018 이 핸들에서 이전 비동기 작업을 완료하기 위해 SQLCompleteAsync 가 호출되지 않았습니다. 핸들의 이전 함수 호출이 SQL_STILL_EXECUTING 반환하고 알림 모드가 활성화된 경우 사후 처리를 수행하고 작업을 완료하려면 핸들에서 SQLCompleteAsync 를 호출해야 합니다.

주석

ODBC 3의 경우x 드라이버, HandleType이 SQL_HANDLE_ENV 핸들 이 유효한 환경 핸들인 경우 드라이버 관리자는 환경과 연결된 각 드라이버에서 SQLEndTran을 호출합니다. 드라이버 호출에 대한 Handle 인수는 드라이버의 환경 핸들입니다. ODBC 2의 경우x 드라이버입니다. HandleType이 SQL_HANDLE_ENV 있고 Handle이 유효한 환경 핸들이고 해당 환경에서 연결된 상태에 여러 연결이 있는 경우 드라이버 관리자는 해당 환경의 연결된 상태의 각 연결에 대해 드라이버의 SQLTransact를 한 번 호출합니다. 각 호출의 Handle 인수는 연결의 핸들입니다. 두 경우 모두 드라이버는 해당 환경의 연결된 상태에 있는 모든 연결에서 CompletionType에 따라 트랜잭션을 커밋하거나 롤백하려고 시도합니다. 활성이 아닌 연결은 트랜잭션에 영향을 미치지 않습니다.

참고 항목

SQLEndTran 은 공유 환경에서 트랜잭션을 커밋하거나 롤백하는 데 사용할 수 없습니다. 공유 환경의 핸들 또는 공유 환경의 연결 핸들로 설정된 핸들사용하여 SQLEndTran을 호출하면 SQLSTATE HY092(잘못된 특성/옵션 식별자)가 반환됩니다.

드라이버 관리자는 각 연결에 대한 SQL_SUCCESS 수신하는 경우에만 SQL_SUCCESS 반환합니다. 드라이버 관리자가 하나 이상의 연결에서 SQL_ERROR 받으면 애플리케이션에 SQL_ERROR 반환하고 진단 정보는 환경의 진단 데이터 구조에 배치됩니다. 커밋 또는 롤백 작업 중에 실패한 연결 또는 연결을 확인하기 위해 애플리케이션은 각 연결에 대해 SQLGetDiagRec를 호출할 수 있습니다.

참고 항목

드라이버 관리자는 모든 연결에서 전역 트랜잭션을 시뮬레이션하지 않으므로 2단계 커밋 프로토콜을 사용하지 않습니다.

CompletionType이 SQL_COMMIT 경우 SQLEndTran은 영향을 받는 연결과 연결된 문에 대한 모든 활성 작업에 대한 커밋 요청을 실행합니다. CompletionType이 SQL_ROLLBACK 경우 SQLEndTran은 영향을 받는 연결과 연결된 문에 대해 모든 활성 작업에 대한 롤백 요청을 실행합니다. 활성 트랜잭션 이 없으면 SQLEndTran 은 데이터 원본에 영향을 주지 않고 SQL_SUCCESS 반환합니다. 자세한 내용은 트랜잭션 커밋 및 롤백을 참조 하세요.

드라이버가 수동 커밋 모드인 경우(SQL_ATTR_AUTOCOMMIT 특성이 SQL_AUTOCOMMIT_OFF 설정된 SQLSetConnectAttr를 호출하여) 트랜잭션 내에 포함될 수 있는 SQL 문이 현재 데이터 원본에 대해 실행될 때 새 트랜잭션이 암시적으로 시작됩니다. 자세한 내용은 커밋 모드를 참조 하세요.

트랜잭션 작업이 커서에 미치는 영향을 확인하기 위해 애플리케이션은 SQL_CURSOR_ROLLBACK_BEHAVIOR 및 SQL_CURSOR_COMMIT_BEHAVIOR 옵션을 사용하여 SQLGetInfo를 호출합니다. 자세한 내용은 다음 단락을 참조하고 커서 및 준비된 문에 대한 트랜잭션 효과도 참조 하세요.

SQL_CURSOR_ROLLBACK_BEHAVIOR 또는 SQL_CURSOR_COMMIT_BEHAVIOR 값이 SQL_CB_DELETE 같으면 SQLEndTran 은 연결과 연결된 모든 문에서 열려 있는 모든 커서를 닫고 삭제하고 보류 중인 모든 결과를 삭제합니다. SQLEndTran은 할당된(준비되지 않은) 상태로 모든 문을 유지합니다. 애플리케이션은 후속 SQL 요청에 다시 사용하거나 핸들타입이 SQL_HANDLE_STMT SQLFreeStmt 또는 SQLFreeHandle을 호출하여 할당을 취소할 수 있습니다.

SQL_CURSOR_ROLLBACK_BEHAVIOR 또는 SQL_CURSOR_COMMIT_BEHAVIOR 값이 SQL_CB_CLOSE 같으면 SQLEndTran 은 연결과 연결된 모든 문에서 열려 있는 모든 커서를 닫습니다. SQLEndTran은 준비된 상태로 모든 문을 유지합니다. 애플리케이션은 먼저 SQLPrepare를 호출하지 않고 연결과 연결된 문에 대해 SQLExecute를 호출할 수 있습니다.

SQL_CURSOR_ROLLBACK_BEHAVIOR 또는 SQL_CURSOR_COMMIT_BEHAVIOR 값이 SQL_CB_PRESERVE 같으면 SQLEndTran 은 연결과 연결된 열린 커서에 영향을 주지 않습니다. 커서는 SQLEndTran을 호출하기 전에 가리키는 행에 남아 있습니다.

트랜잭션을 지원하는 드라이버 및 데이터 원본의 경우 트랜잭션이 활성화되지 않은 경우 SQL_COMMIT 또는 SQL_ROLLBACK 사용하여 SQLEndTran을 호출하면 SQL_SUCCESS 반환되고(커밋되거나 롤백할 작업이 없음을 나타낸) 데이터 원본에 영향을 주지 않습니다.

드라이버가 자동 커밋 모드인 경우 드라이버 관리자는 드라이버에서 SQLEndTran을 호출하지 않습니다. SQLEndTran은 SQL_COMMIT 또는 SQL_ROLLBACK CompletionType으로 호출되는지 여부에 관계없이 항상 SQL_SUCCESS 반환합니다.

트랜잭션을 지원하지 않는 드라이버 또는 데이터 원본(SQLGetInfo옵션 SQL_TXN_CAPABLE SQL_TC_NONE)은 항상 자동 커밋 모드이므로 SQL_COMMIT 또는 SQL_ROLLBACK CompletionType을 사용하여 호출되는지 여부에 관계없이 항상 SQLEndTran에 대한 SQL_SUCCESS 반환합니다. 이러한 드라이버 및 데이터 원본은 요청 시 트랜잭션을 실제로 롤백하지 않습니다.

일시 중단됨 상태

Windows 7 이전에 릴리스된 드라이버 관리자에서 SQLEndTran이 드라이버에서 SQL_ERROR 반환한 경우 트랜잭션이 활성화되었습니다. 그러나 서버에서 트랜잭션이 성공적으로 커밋되었을 수 있지만 클라이언트의 드라이버에 알림이 표시되지 않았습니다(예: 네트워크 오류가 발생했기 때문). 이렇게 하면 연결이 잘못된 상태로 남습니다. Windows 7부터 SQLEndTranSQL_ERROR 반환하면 연결이 일시 중단된 상태일 수 있습니다. 일시 중단된 상태에서 읽기 전용 함수를 호출할 수 있습니다. 결국 애플리케이션은 일시 중단된 연결에서 SQLDisconnect를 호출하여 리소스를 해제해야 합니다.

다음 조건이 모두 true이면 연결이 일시 중단된 상태로 전환됩니다.

  • 드라이버는 SQLEndTran에서 SQL_ERROR 반환합니다.

  • 드라이버는 ODBC 버전 3.8 이상입니다.

  • 애플리케이션 버전은 3.8 이상입니다. 또는 다시 컴파일된 ODBC 2.x 또는 3.x 애플리케이션이 SQLCancelHandle을 통해 SQLEndTran 함수를 성공적으로 취소합니다.

  • 드라이버는 트랜잭션이 완료되지 않았음을 확인하는 다음 메시지 중 하나를 반환하지 않았습니다.

    • 25S03: 트랜잭션 롤백

    • 40001: Serialization 실패

    • 40002: 무결성 제약 조건

    • HYC00: 선택적 기능이 구현되지 않음

SQLEndTran이 환경 핸들에서 호출되고 해당 연결 중 하나가 위의 조건을 충족하는 경우 동일한 드라이버에 연결하는 모든 연결이 일시 중단된 상태로 전환됩니다.

애플리케이션이 일시 중단된 연결에서 SQLDisconnect를 호출한 후 연결을 사용하여 다른 데이터 원본 또는 동일한 데이터 원본에 다시 연결할 수 있습니다.

추가 정보 참조
연결 핸들에서 비동기적으로 실행되는 함수를 취소합니다. SQLCancelHandle 함수
드라이버 또는 데이터 원본에 대한 정보 반환 SQLGetInfo 함수
핸들 해제 SQLFreeHandle 함수
문 핸들 해제 SQLFreeStmt 함수

참고 항목

ODBC API 참조
ODBC 헤더 파일
비동기 실행(폴링 메서드)