Compartir vía


Función SQLEndTran

Conformidad
Versión introducida: Cumplimiento de estándares ODBC 3.0: ISO 92

Resumen
SQLEndTran solicita una operación de confirmación o reversión para todas las operaciones activas en todas las instrucciones asociadas a una conexión. SQLEndTran también puede solicitar que se realice una operación de confirmación o reversión para todas las conexiones asociadas a un entorno.

Nota:

Para obtener más información sobre lo que el Administrador de controladores asigna esta función a cuando un ODBC 3.La aplicación x funciona con ODBC 2.Controlador x , consulte Asignación de funciones de reemplazo para compatibilidad con versiones anteriores de aplicaciones.

Sintaxis

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

Argumentos

HandleType
[Entrada] Controle el identificador de tipo. Contiene SQL_HANDLE_ENV (si Handle es un identificador de entorno) o SQL_HANDLE_DBC (si Handle es un identificador de conexión).

Handle
[Entrada] Identificador del tipo indicado por HandleType, que indica el ámbito de la transacción. Consulte "Comentarios" para obtener más información.

CompletionType
[Entrada] Uno de los dos valores siguientes:

SQL_COMMIT SQL_ROLLBACK

Devoluciones

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE o SQL_STILL_EXECUTING.

Diagnóstico

Cuando SQLEndTran devuelve SQL_ERROR o SQL_SUCCESS_WITH_INFO, se puede obtener un valor SQLSTATE asociado mediante una llamada a SQLGetDiagRec con el handleType y handle adecuados. En la tabla siguiente se enumeran los valores SQLSTATE devueltos normalmente por SQLEndTran y se explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de SQLSTATEs devueltas por el Administrador de controladores. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.

SQLSTATE Error Descripción
01000 Advertencia general Mensaje informativo específico del controlador. (Function devuelve SQL_SUCCESS_WITH_INFO).
08003 Conexión no abierta (DM) El handleType se SQL_HANDLE_DBC y el identificador no estaba en un estado conectado.
08007 Error de conexión durante la transacción HandleType se SQL_HANDLE_DBC y se produjo un error en la conexión asociada a Handle durante la ejecución de la función y no se puede determinar si se produjo la confirmación solicitada o ROLLBACK antes del error.
25S01 Estado de transacción desconocido Una o varias de las conexiones de Handle no pudieron completar la transacción con el resultado especificado y el resultado es desconocido.
25S02 La transacción todavía está activa El controlador no pudo garantizar que todo el trabajo de la transacción global se pudiera completar de forma atómica y la transacción todavía está activa.
25S03 La transacción se revierte El controlador no pudo garantizar que todo el trabajo de la transacción global se pudiera completar de forma atómica y todo el trabajo de la transacción activa en Handle se revierte.
40001 Error de serialización La transacción se revierte debido a un interbloqueo de recursos con otra transacción.
40002 Infracción de restricción de integridad CompletionType se SQL_COMMIT y el compromiso de los cambios provocó una infracción de restricción de integridad. Como resultado, la transacción se revierte.
HY000 Error general Se produjo un error para el que no había ningún SQLSTATE específico y para el que no se definió SQLSTATE específico de la implementación. El mensaje de error devuelto por SQLGetDiagRec en el búfer *szMessageText describe el error y su causa.
HY001 Error de asignación de memoria El controlador no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función.
HY008 Operación cancelada El procesamiento asincrónico se ha habilitado para ConnectionHandle. Se llamó a la función y antes de terminar de ejecutar la función SQLCancelHandle se llamó a en ConnectionHandle. A continuación, se llamó a la función de nuevo en ConnectionHandle.

Se llamó a la función y antes de terminar de ejecutar SQLCancelHandle se llamó a en ConnectionHandle desde un subproceso diferente en una aplicación multithread.
HY010 Error de secuencia de funciones (DM) Se llamó a una función de ejecución asincrónica para un identificador de instrucción asociado a ConnectionHandle y todavía se estaba ejecutando cuando se llamó a SQLEndTran .

(DM) Se llamó a una función que ejecuta de forma asincrónica (no esta) para ConnectionHandle y todavía se estaba ejecutando cuando se llamó a esta función.

(DM) se llamó a SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos para un identificador de instrucción asociado a ConnectionHandle y se devolvió SQL_NEED_DATA. Se llamó a esta función antes de enviar datos para todos los parámetros o columnas de datos en ejecución.

(DM) Se llamó a una función que ejecuta de forma asincrónica (no esta) para el identificador con HandleType establecido en SQL_HANDLE_DBC y todavía se estaba ejecutando cuando se llamó a esta función.

(DM) SE llamó a SQLExecute, SQLExecDirect o SQLMoreResults para uno de los identificadores de instrucción asociados a Handle y devueltos SQL_PARAM_DATA_AVAILABLE. Se llamó a esta función antes de recuperar los datos para todos los parámetros transmitidos.
HY012 Código de operación de transacción no válido (DM) El valor especificado para el argumento CompletionType no se SQL_COMMIT ni SQL_ROLLBACK.
HY013 Error de administración de memoria No se pudo procesar la llamada de función porque no se pudo tener acceso a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria baja.
HY092 Identificador de atributo o opción no válido (DM) El valor especificado para el argumento HandleType no se SQL_HANDLE_ENV ni SQL_HANDLE_DBC.
HY115 SQLEndTran no está permitido para un entorno que contenga una conexión con la ejecución de funciones asincrónicas habilitada (DM) HandleType no se puede establecer en SQL_HANDLE_ENV si la ejecución asincrónica de funciones de conexión está habilitada para una conexión en el entorno.
HY117 La conexión se suspende debido al estado de transacción desconocido. Solo se permiten las funciones de desconexión y solo lectura. (DM) Para obtener más información sobre el estado suspendido, consulte la sección Comentarios de este tema.
HYC00 Característica opcional no implementada El controlador o el origen de datos no admiten la operación ROLLBACK .
HYT01 Se ha agotado el tiempo de espera de la conexión. El período de tiempo de espera de conexión expiró antes de que el origen de datos respondiera a la solicitud. El período de tiempo de espera de conexión se establece a través de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 El controlador no admite esta función (DM) El controlador asociado a ConnectionHandle no admite la función .
IM017 El sondeo está deshabilitado en modo de notificación asincrónica Cada vez que se usa el modelo de notificación, el sondeo está deshabilitado.
IM018 No se ha llamado a SQLCompleteAsync para completar la operación asincrónica anterior en este identificador. Si la llamada de función anterior en el identificador devuelve SQL_STILL_EXECUTING y si el modo de notificación está habilitado, se debe llamar a SQLCompleteAsync en el identificador para realizar el procesamiento posterior y completar la operación.

Comentarios

Para odbc 3.x driver, si HandleType es SQL_HANDLE_ENV y Handle es un identificador de entorno válido, el Administrador de controladores llamará a SQLEndTran en cada controlador asociado al entorno. El argumento Handle para la llamada a un controlador será el identificador del entorno del controlador. Para odbc 2.x driver, si HandleType es SQL_HANDLE_ENV y Handle es un identificador de entorno válido y hay varias conexiones en un estado conectado en ese entorno, el Administrador de controladores llamará a SQLTransact en el controlador una vez para cada conexión en un estado conectado en ese entorno. El argumento Handle de cada llamada será el identificador de la conexión. En cualquier caso, el controlador intentará confirmar o revertir transacciones, dependiendo del valor de CompletionType, en todas las conexiones que están en un estado conectado en ese entorno. Las conexiones que no están activas no afectan a la transacción.

Nota:

SQLEndTran no se puede usar para confirmar ni revertir transacciones en un entorno compartido. SQLSTATE HY092 (identificador de atributo o opción no válido) se devolverá si se llama a SQLEndTran con Handle establecido en el identificador de un entorno compartido o el identificador de una conexión en un entorno compartido.

El Administrador de controladores devolverá SQL_SUCCESS solo si recibe SQL_SUCCESS para cada conexión. Si el Administrador de controladores recibe SQL_ERROR en una o varias conexiones, devuelve SQL_ERROR a la aplicación y la información de diagnóstico se coloca en la estructura de datos de diagnóstico del entorno. Para determinar qué conexión o conexiones no se pudieron realizar durante la operación de confirmación o reversión, la aplicación puede llamar a SQLGetDiagRec para cada conexión.

Nota:

El Administrador de controladores no simula una transacción global en todas las conexiones y, por tanto, no usa protocolos de confirmación en dos fases.

Si CompletionType es SQL_COMMIT, SQLEndTran emite una solicitud de confirmación para todas las operaciones activas en cualquier instrucción asociada a una conexión afectada. Si CompletionType es SQL_ROLLBACK, SQLEndTran emite una solicitud de reversión para todas las operaciones activas en cualquier instrucción asociada a una conexión afectada. Si no hay ninguna transacción activa, SQLEndTran devuelve SQL_SUCCESS sin ningún efecto en ningún origen de datos. Para obtener más información, consulte Confirmar y revertir transacciones.

Si el controlador está en modo de confirmación manual (llamando a SQLSetConnectAttr con el atributo SQL_ATTR_AUTOCOMMIT establecido en SQL_AUTOCOMMIT_OFF), se inicia implícitamente una nueva transacción cuando se ejecuta una instrucción SQL que se puede contener dentro de una transacción en el origen de datos actual. Para obtener más información, vea Modo de confirmación.

Para determinar cómo afectan las operaciones de transacción a los cursores, una aplicación llama a SQLGetInfo con las opciones SQL_CURSOR_ROLLBACK_BEHAVIOR y SQL_CURSOR_COMMIT_BEHAVIOR. Para obtener más información, vea los párrafos siguientes y vea también Efecto de las transacciones en cursores e instrucciones preparadas.

Si el valor de SQL_CURSOR_ROLLBACK_BEHAVIOR o SQL_CURSOR_COMMIT_BEHAVIOR es igual a SQL_CB_DELETE, SQLEndTran cierra y elimina todos los cursores abiertos en todas las instrucciones asociadas a la conexión y descarta todos los resultados pendientes. SQLEndTran deja cualquier instrucción presente en un estado asignado (no preparado); la aplicación puede reutilizarlas para las solicitudes SQL posteriores o puede llamar a SQLFreeStmt o SQLFreeHandle con un HandleType de SQL_HANDLE_STMT para desasignarlos.

Si el valor SQL_CURSOR_ROLLBACK_BEHAVIOR o SQL_CURSOR_COMMIT_BEHAVIOR es igual a SQL_CB_CLOSE, SQLEndTran cierra todos los cursores abiertos en todas las instrucciones asociadas a la conexión. SQLEndTran deja cualquier instrucción presente en un estado preparado; la aplicación puede llamar a SQLExecute para una instrucción asociada a la conexión sin llamar primero a SQLPrepare.

Si el valor SQL_CURSOR_ROLLBACK_BEHAVIOR o SQL_CURSOR_COMMIT_BEHAVIOR es igual a SQL_CB_PRESERVE, SQLEndTran no afecta a los cursores abiertos asociados a la conexión. Los cursores permanecen en la fila a la que apuntaban antes de la llamada a SQLEndTran.

Para controladores y orígenes de datos que admiten transacciones, llamando a SQLEndTran con SQL_COMMIT o SQL_ROLLBACK cuando ninguna transacción está activa devuelve SQL_SUCCESS (lo que indica que no hay ningún trabajo que confirmar o revertir) y no tiene ningún efecto en el origen de datos.

Cuando un controlador está en modo de confirmación automática, el Administrador de controladores no llama a SQLEndTran en el controlador. SQLEndTran siempre devuelve SQL_SUCCESS independientemente de si se llama a con un completionType de SQL_COMMIT o SQL_ROLLBACK.

Los controladores o orígenes de datos que no admiten transacciones (la opción SQLGetInfo SQL_TXN_CAPABLE es SQL_TC_NONE) siempre están en modo de confirmación automática y, por tanto, siempre devuelven SQL_SUCCESS para SQLEndTran tanto si se llaman con un tipo de finalización de SQL_COMMIT como SQL_ROLLBACK. Estos controladores y orígenes de datos no revierten realmente las transacciones cuando se solicita que lo haga.

Estado suspendido

En administradores de controladores que se publicaron antes de Windows 7, una transacción estaba activa si SQLEndTran devolvió SQL_ERROR del controlador. Sin embargo, era posible que la transacción se hubiera confirmado correctamente en el servidor, pero no se había notificado al controlador del cliente (por ejemplo, porque se produjo un error de red). Esto dejaría la conexión en un estado incorrecto. A partir de Windows 7, cuando SQLEndTran devuelve SQL_ERROR, la conexión podría estar en estado suspendido. En un estado suspendido, es posible llamar a funciones de solo lectura. Finalmente, la aplicación debe llamar a SQLDisconnect en una conexión suspendida para liberar recursos.

Si se cumplen todas las condiciones siguientes, la conexión se colocará en un estado suspendido:

  • El controlador devuelve SQL_ERROR de SQLEndTran.

  • El controlador es ODBC versión 3.8 o posterior.

  • La versión de la aplicación es 3.8 o posterior; o bien, la aplicación ODBC 2.x o 3.x recompilada cancela correctamente la función SQLEndTran a través de SQLCancelHandle.

  • El controlador no devolvió uno de los siguientes mensajes, lo que confirma que la transacción no se completó:

    • 25S03: La transacción se revierte

    • 40001: Error de serialización

    • 40002: Restricción de integridad

    • HYC00: característica opcional no implementada

Si se llamó a SQLEndTran en un identificador de entorno y una de sus conexiones cumplen las condiciones anteriores, todas las conexiones que se conectan al mismo controlador se colocarán en el estado suspendido.

Una vez que una aplicación llama a SQLDisconnect en una conexión suspendida, la conexión se puede usar para volver a conectarse a otro origen de datos o al mismo origen de datos.

Para obtener información sobre Vea
Cancelación de una función que se ejecuta de forma asincrónica en un identificador de conexión. Función SQLCancelHandle
Devolver información sobre un controlador o un origen de datos Función SQLGetInfo
Liberar un identificador Función SQLFreeHandle
Liberar un identificador de instrucción Función SQLFreeStmt

Consulte también

Referencia de API ODBC
Archivos de encabezado de ODBC
Ejecución asincrónica (método de sondeo)