Compartir vía


Efecto de las transacciones en los cursores y las instrucciones preparadas

Confirmar o revertir una transacción tiene uno de los siguientes efectos en los cursores y los planes de acceso:

  • Todos los cursores están cerrados y los planes de acceso para instrucciones preparadas en esa conexión se eliminan.

  • Todos los cursores están cerrados y los planes de acceso para las instrucciones preparadas en esa conexión permanecen intactos.

  • Todos los cursores permanecen abiertos y los planes de acceso para las instrucciones preparadas en esa conexión permanecen intactos.

Por ejemplo, supongamos que un origen de datos muestra el primer comportamiento de esta lista, el más restrictivo de estos comportamientos. Ahora, supongamos que una aplicación hace lo siguiente:

  1. Establece el modo de confirmación en confirmación manual.

  2. Crea un conjunto de resultados de pedidos de ventas en la instrucción 1.

  3. Crea un conjunto de resultados de las líneas de un pedido de ventas en la instrucción 2 cuando el usuario resalta ese pedido.

  4. Llama a SQLExecute para ejecutar una instrucción de actualización posicionada preparada en la instrucción 3 cuando el usuario actualiza una línea.

  5. Llama a SQLEndTran para confirmar la instrucción de actualización posicionada.

Debido al comportamiento del origen de datos, la llamada a SQLEndTran en el paso 5 hace que cierre los cursores de las instrucciones 1 y 2 y elimine el plan de acceso en todas las instrucciones. La aplicación debe volver a ejecutar las instrucciones 1 y 2 para volver a crear los conjuntos de resultados y volver a preparar la instrucción en la instrucción 3.

En el modo de confirmación automática, funciones distintas de SQLEndTran confirman las transacciones:

  • SQLExecute o SQLExecDirect En el ejemplo anterior, la llamada a SQLExecute en el paso 4 confirma una transacción. Esto hace que el origen de datos cierre los cursores de las instrucciones 1 y 2 y elimine el plan de acceso en todas las instrucciones de esa conexión.

  • SQLBulkOperations o SQLSetPos En el ejemplo anterior, supongamos que en el paso 4 la aplicación llama a SQLSetPos con la opción SQL_UPDATE en la instrucción 2, en lugar de ejecutar una instrucción de actualización posicionada en la instrucción 3. Esto confirma una transacción y hace que el origen de datos cierre los cursores de las instrucciones 1 y 2 y descarte todos los planes de acceso en esa conexión.

  • SQLCloseCursor En el ejemplo anterior, supongamos que cuando el usuario resalta un pedido de ventas diferente, la aplicación llama a SQLCloseCursor en la instrucción 2 antes de crear un resultado de las líneas para el nuevo pedido de ventas. La llamada a SQLCloseCursor confirma la instrucción SELECT que creó el conjunto de resultados de líneas y hace que el origen de datos cierre el cursor en la instrucción 1 y, a continuación, descarta todos los planes de acceso en esa conexión.

Las aplicaciones, especialmente las aplicaciones basadas en pantalla en las que el usuario se desplaza alrededor del conjunto de resultados y actualiza o elimina filas, deben tener cuidado de codificar este comportamiento.

Para determinar cómo se comporta un origen de datos cuando se confirma o se revierte una transacción, una aplicación llama a SQLGetInfo con las opciones de SQL_CURSOR_COMMIT_BEHAVIOR y SQL_CURSOR_ROLLBACK_BEHAVIOR.