Transacciones (eventos de Windows)

Se aplica a: Windows | Windows Server

Transacciones

Las transacciones de ESE son unidades lógicas de procesamiento que controlan cómo una aplicación ve y manipula filas en la base de datos. La aplicación puede usar puntos de guardado de transacciones para determinar si se debe conservar o descartar un conjunto determinado de cambios en la base de datos. Todas las transacciones de ESE son atómicas, coherentes, aisladas y duraderas (ACID), como se describe a continuación:

  • Atómica: Todas las actualizaciones de la transacción aparecen en la base de datos o se descartan.
  • Consistente: La base de datos siempre se iniciará en un estado legal y siempre terminará en otro estado legal. En el caso de las aplicaciones ESE, el motor de base de datos controlará algunas restricciones simples, por ejemplo, la unicidad de un índice único, pero la propia aplicación definirá casi todos los demás aspectos de lo que significa que la base de datos esté en un estado legal.
  • Aislamiento: Otras sesiones aíslan las transacciones de las actualizaciones. Una transacción nunca verá un conjunto parcial de cambios realizados por otra transacción.
  • Durable: Una vez que el motor de base de datos confirma que se ha confirmado una transacción, sus cambios son persistentes en la base de datos. La durabilidad de una transacción puede renunciar opcionalmente por motivos de rendimiento.

Las transacciones se realizan dentro de los límites de las llamadas a JetBeginTransaction y JetCommitTransaction o JetRollback. Cuando la aplicación entra en la transacción, la base de datos aparece inmovilizada en la instancia en el momento en que comienza la transacción. Esto se denomina aislamiento de instantáneas. Si la transacción finaliza llamando a JetRollback, ninguna de las operaciones realizadas en la transacción se confirma en la base de datos. Si el proceso o la máquina se bloquean antes de llamar a JetCommitTransaction , es lo mismo que llamar a JetRollback.

Este procedimiento muestra cómo iniciar y confirmar una transacción que lee y actualiza los datos de una base de datos.

Para iniciar y confirmar una transacción

  1. Llame a JetBeginTransaction o JetBeginTransaction2 con el identificador de sesión para iniciar la transacción.

  2. Mueva el cursor al registro deseado llamando a JetMove con JET_MoveFirst especificado en el parámetro cRow . Para obtener más información sobre cómo mover el cursor, vea el tema Indexación en la tabla .

  3. Llame a JetGetTableColumnInfo en el registro actual con JET_ColInfo especificado en el parámetro InfoLevel para recuperar el identificador de columna de la columna. El identificador de columna se devuelve en la estructura JET_COLUMNDEF .

  4. Llame a JetSetColumn con el identificador de sesión, el identificador de tabla y el identificador de columna de la columna que se actualiza. Los datos de columna se encuentran en el parámetro pvData .

  5. Llame a JetCommitTransaction para confirmar la transacción en la base de datos.

La forma en que un motor de base de datos ESE implementa el aislamiento de instantáneas tiene algunas diferencias importantes respecto al aislamiento de base de datos relacional tradicional y a los modelos de bloqueo. Cuando una transacción lee una fila, siempre puede tener acceso a la fila sin errores ni esperar a que otras sesiones liberen un bloqueo. Cuando una transacción intenta actualizar una fila, se realizará correctamente si es la primera sesión para actualizar esa fila, es decir, el primer escritor gana. Si la sesión no es el primer escritor, se producirá un error de conflicto de escritura inmediatamente. A continuación, la sesión debe anular su transacción, esperar (normalmente a través de un retraso aleatorio), para que la otra transacción confirme sus cambios y, a continuación, vuelva a intentar la transacción. El motor de base de datos no hará que esa sesión espere automáticamente hasta que la otra transacción haya finalizado su actualización. Normalmente, una transacción probará si puede actualizar una fila dentro de la llamada jetUpdate . Si no puede bloquear la fila para la actualización, JetUpdate producirá un error con JET_errWriteConflict.

Las sesiones se limitan a un subproceso desde el momento en que la transacción comienza al final de la transacción. Se recomienda realizar todas las operaciones de actualización y recuperación en una transacción. ESE también admite modificaciones de esquema, como la creación de tablas y la adición de columnas dentro de la transacción. Tanto las modificaciones de actualización como de esquema se pueden realizar en la misma transacción. Una vez completada la transacción con JetCommitTransaction, la actualización se registra en el archivo de registro de transacciones. Estos archivos se pueden usar para mantener un estado coherente lógicamente en caso de terminación inesperada del proceso o apagado del sistema.

Las transacciones se pueden anidar hasta 7 niveles con llamadas coincidentes a JetBeginTransaction y JetCommitTransaction o JetRollback anidados entre sí. Esto permite que la aplicación revierta una parte de la transacción sin tener que volver a salir de toda la transacción. La llamada anidada a JetCommitTransaction indica que este nivel de procesamiento está completo; sin embargo, la transacción no se confirma en la base de datos hasta que la llamada más externa confirme la transacción con JetCommitTransaction.

Las columnas de actualización de custodia se pueden actualizar simultáneamente mediante varias sesiones sin errores con Jet_errWriteConflict. Solo se puede llamar a la función JetEscrowUpdate en columnas de custodia, columnas creadas con Jet_bitColumnEscrowUpdate.