Procesamiento de transacciones
Una transacción delimita el principio y el final de una serie de operaciones de acceso a datos ejecutadas mediante una conexión. Dependiendo de las funcionalidades transaccionales del origen de datos, el objeto Connection también le permite crear y administrar transacciones. Por ejemplo, con el proveedor OLE DB de Microsoft para SQL Server para acceder a una base de datos en Microsoft SQL Server, puede crear múltiples transacciones anidadas para los comandos que ejecute.
ADO garantiza que los cambios realizados en un origen de datos que se producen como resultado de las operaciones de una transacción se produzcan correctamente de forma conjunta o no.
Si se cancela la transacción, o si se produce un error en una de las operaciones, el resultado será como si no hubiera ocurrido ninguna de las operaciones de la transacción. El origen de los datos permanecerá como estaba antes de que se iniciase la transacción.
ADO proporciona los siguientes métodos para controlar las transacciones: BeginTrans, CommitTrans y RollbackTrans. Use estos métodos con un objeto Connection cuando quiera guardar o cancelar una serie de cambios realizados en los datos de origen como una sola unidad. Por ejemplo, para transferir dinero entre cuentas, resta una cantidad de una cuenta y agrega la misma cantidad a la otra. Si se produce un error en alguna actualización, las cuentas ya no estarán compensadas. Realizar estos cambios dentro de una transacción abierta garantiza que todos o ninguno de los cambios tengan lugar.
Nota
No todos los proveedores de bases de datos admiten transacciones. Compruebe que la propiedad definida por el proveedor "Transaction DDL" aparezca en la colección Properties del objeto Connection, lo que indica que el proveedor admite transacciones. Si el proveedor no admite transacciones y llama a uno de estos métodos, aparecerá un error.
Después de llamar al método BeginTrans, el proveedor ya no confirmará instantáneamente los cambios que realice hasta que llame a CommitTrans o RollbackTrans para finalizar la transacción.
La llamada al método CommitTrans, guarda los cambios realizados en una transacción abierta en la conexión y la finaliza. Al llamar al método RollbackTrans, se invierten los cambios realizados en una transacción abierta y finaliza la transacción. Llamar a cualquiera de los métodos cuando no hay una transacción abierta genera un error.
Dependiendo del objeto Connectionde la propiedadAttributes, llamar al método CommitTrans o RollbackTrans puede iniciar automáticamente una nueva transacción. Si la propiedad Attributes se establece en adXactCommitRetaining, el proveedor inicia automáticamente una nueva transacción después de una llamada a CommitTrans. Si la propiedad Attributes se establece en adXactAbortRetaining, el proveedor inicia automáticamente una nueva transacción después de una llamada a RollbackTrans.
Nivel de aislamiento de transacción
Utilice la propiedad IsolationLevel para establecer el nivel de aislamiento de una transacción en un objeto Connection. La configuración no se hace efectivo hasta la próxima vez que se llame al método BeginTrans. Si el nivel de aislamiento solicitado no está disponible, el proveedor puede devolver el nivel de aislamiento inmediatamente mayor. Consulte la propiedad IsolationLevel en la Referencia del programador de ADO para obtener más detalles sobre los valores válidos.
Transacciones anidadas
Para los proveedores que admiten transacciones anidadas, llamar al método BeginTrans dentro de una transacción abierta inicia una transacción anidada nueva. El valor devuelto indica el nivel de anidamiento: un valor de "1" indica que ha abierto una transacción de nivel superior (es decir, la transacción no está anidada dentro de otra transacción), "2" indica que ha abierto una transacción de segundo nivel (una transacción anidada dentro de una transacción de nivel superior), etc. Llamar a CommitTrans o RollbackTrans afecta solo a la última transacción abierta; debe cerrar o revertir la transacción actual para poder resolver cualquier transacción de nivel superior.