Usar transacciones en un objeto Recordset de DAO

Una transacción es un conjunto de operaciones agrupadas y manejadas como una única unidad de trabajo. El trabajo de una transacción debe completarse en su totalidad; si se produce un error en alguna parte de la transacción, se produce un error en toda la transacción. Las transacciones ofrecen al desarrollador la capacidad de exigir la integridad de los datos. Con varias operaciones de base de datos agrupadas en una única unidad que debe tener éxito o fallar en su conjunto, la base de datos no puede alcanzar un estado incoherente. Las transacciones son comunes a la mayoría de los sistemas de administración de bases de datos.

El ejemplo más habitual de procesamiento de transacciones lo representa el cajero de automático de un banco (ATM). Los procesos de expedición de dinero en efectivo y posterior carga del importe en la cuenta del usuario se consideran una unidad lógica de trabajo y están agrupados en una transacción: El dinero no se expide a menos que el sistema pueda cargarlo en la cuenta. Mediante el uso de una transacción, toda la operación o se realiza correctamente o genera un error. Esto mantiene en un estado coherente la base de datos del cajero automático.

Considere la posibilidad de utilizar transacciones si desea asegurarse de que cada una de las operaciones de un grupo de operaciones se realiza correctamente antes de confirmarlas todas. Tenga en cuenta que cada una de las transacciones resulta invisible para el resto. Es decir, ninguna transacción puede ver las actualizaciones realizadas por otra en la base de datos hasta que ésta se confirma.

Nota

El comportamiento de las transacciones con bases de datos de Access es diferente al comportamiento de los orígenes de datos ODBC, como SQL Server. Por ejemplo, si una base de datos se conecta a un servidor de archivos, y éste se detiene antes de que una transacción haya tenido tiempo de realizar sus cambios, entonces la base de datos podría quedar en un estado incoherente. Si necesita asistencia real con las transacciones con respecto a la durabilidad, debería considerar una arquitectura cliente/servidor.

El motor de base de datos de Access admite transacciones a través de los métodos BeginTrans, CommitTrans y Rollback de DAO del objeto Workspace.

El siguiente ejemplo de código cambia el puesto de todos los representantes de ventas de la tabla Empleados. Después de que el método BeginTrans inicie una transacción que aísla todos los cambios realizados en la tabla Empleados, el método CommitTrans guarda los cambios. Tenga en cuenta que puede utilizar el método Rollback para deshacer cambios que ha guardado con el método Update.

Sub ChangeTitle() 
 
Dim wrkCurrent As DAO.Workspace 
Dim dbsNorthwind As DAO.Database 
Dim rstEmployee As DAO.Recordset 
 
On Error GoTo ErrorHandler 
 
   Set wrkCurrent = DBEngine.Workspaces(0) 
   Set dbsNorthwind = CurrentDB 
   Set rstEmployee = dbsNorthwind.OpenRecordset("Employees") 
 
   wrkCurrent.BeginTrans 
   Do Until rstEmployee.EOF 
      If rstEmployee!Title = "Sales Representative" Then 
         rstEmployee.Edit 
         rstEmployee!Title = "Sales Associate" 
         rstEmployee.Update 
      End If 
      rstEmployee.MoveNext 
   Loop 
 
   If MsgBox("Save all changes?", vbQuestion + vbYesNo) = vbYes Then 
      wrkCurrent.CommitTrans 
   Else 
      wrkCurrent.Rollback 
   End If 
 
   rstEmployee.Close 
   dbsNorthwind.Close 
   wrkCurrent.Close 
 
   Set rstEmployee = nothing 
   Set dbsNorthwind = Nothing 
   Set wrkCurrent = Nothing 
 
   Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

Cuando se usan transacciones, se ven afectadas todas las bases de datos y los objetos Recordset del objeto Workspace especificado; las transacciones son globales para el área de trabajo, no para una base de datos específica o Recordset. Si realiza operaciones en varias bases de datos o dentro de una transacción del área de trabajo, los métodos Commit y Rollback afectarán a todos los objetos modificados dentro de dicha área de trabajo durante la transacción.

También puede usar los métodos BeginTrans, CommitTrans y Rollback con el objeto DBEngine. En este caso, la transacción se aplica al área de trabajo predeterminada, que es DBEngine.Workspaces(0).

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.