Función JetBeginTransaction

Se aplica a: Windows | Windows Server

Función JetBeginTransaction

La función JetBeginTransaction hace que una sesión escriba una transacción y cree un nuevo punto de guardado. Se puede llamar a esta función más de una vez en una sola sesión para provocar la creación de puntos de guardado adicionales. Estos puntos de guardado se pueden usar para mantener o descartar de forma selectiva los cambios en el estado de la base de datos.

    JET_ERR JET_API JetBeginTransaction(
      __in          JET_SESID sesid
    );

Parámetros

sesid

La sesión que se va a usar para esta llamada.

Valor devuelto

Esta función devuelve el JET_ERR tipo de datos con uno de los siguientes códigos de retorno. Para obtener más información sobre los posibles errores de ESE, vea Extensible Storage Engine Errors and Error Handling Parameters.

Código devuelto

Descripción

JET_errSuccess

La operación se ha completado correctamente.

JET_errClientRequestToStopJetService

No es posible completar la operación porque toda la actividad de la instancia asociada a la sesión ha dejado de funcionar como resultado de una llamada a JetStopService.

JET_errInstanceUnavailable

No es posible completar la operación porque la instancia asociada a la sesión ha encontrado un error irrecuperable que requiere que se revoque el acceso a todos los datos para proteger la integridad de esos datos.

Este error solo lo devolverá Windows XP y versiones posteriores.

JET_errNotInitialized

No es posible completar la operación porque la instancia asociada a la sesión aún no se ha inicializado.

JET_errRestoreInProgress

No es posible completar la operación porque una operación de restauración está en curso en la instancia asociada a la sesión.

JET_errSessionSharingViolation

No se puede usar la misma sesión para más de un subproceso al mismo tiempo. Este error solo lo devolverá Windows XP y versiones posteriores.

JET_errTermInProgress

No es posible completar la operación porque la instancia asociada a la sesión se está cerrando.

JET_errTransTooDeep

No se puede iniciar una nueva transacción porque la sesión ya está en la profundidad máxima del punto de guardado permitido por el motor de base de datos.

Si se ejecuta correctamente, la sesión proporcionada estará dentro de una transacción. Si la sesión estaba previamente dentro de una transacción, se creará un nuevo punto de guardado.

Si se produce un error, el estado transaccional de la sesión permanecerá sin cambios. No se producirá ningún cambio en el estado de la base de datos.

Observaciones

El motor de base de datos proporciona un modelo de aislamiento de instantáneas para sus transacciones. Esto significa que, cuando una sesión entra por primera vez en un estado transaccional, la sesión verá toda la base de datos inmovilizada en el tiempo al inicio de la transacción. Una sesión no necesita leer ningún dato porque siempre puede acceder a la versión adecuada de esos datos. Esto significa que una sesión que actualiza los datos nunca bloqueará una sesión diferente de la lectura de esos datos.

Otra implicación del uso del aislamiento de instantáneas es el modelo de bloqueo que se usa para las actualizaciones. El motor de base de datos adjudicará un bloqueo de escritura en un fragmento determinado de datos a la primera sesión que lo solicite. Este bloqueo de escritura se libera cuando la transacción se confirma o anula por completo de modo que la sesión ya no esté en una transacción. Mientras una sesión contiene un bloqueo de escritura, cualquier otra sesión que solicite el mismo bloqueo de escritura no se bloqueará hasta que el bloqueo de escritura esté disponible. En su lugar, esa segunda sesión producirá un error inmediato con JET_errWriteConflict. Para resolver este conflicto, la segunda sesión debe anular (o confirmar) su transacción por completo, esperar un pequeño período de tiempo para que la primera sesión confirme o anule su transacción y, a continuación, vuelva a empezar de nuevo.

En compatibilidad con el aislamiento de instantáneas, el motor de base de datos almacena todas las versiones de todos los datos modificados en la memoria desde el momento en que se inició la transacción activa más antigua en cualquier sesión. Esto tiene implicaciones importantes para la aplicación. Cualquier comportamiento que haga que un gran número de versiones se compilen en memoria puede hacer que la instancia agote su tamaño máximo de almacén de versiones (consulte JET_paramMaxVerPages en Parámetros del sistema para obtener más información). Este comportamiento incluye, pero no se limita a actualizaciones muy grandes en una sola transacción y transacciones de ejecución muy larga. Como resultado, es muy importante configurar correctamente el tamaño del almacén de versiones para la carga transaccional esperada de la aplicación. También es importante tener mucho cuidado para limitar el número de actualizaciones realizadas en una sola transacción. Además, es importante realizar transacciones tan cortas como sea posible en escenarios de carga alta.

Se recomienda encarecidamente que la aplicación siempre esté en el contexto de una transacción al llamar a las API de ESE que recuperan o actualizan datos. Si no se hace esto, el motor de base de datos ajustará automáticamente cada llamada API de ESE de este tipo en una transacción en nombre de la aplicación. El costo de estas transacciones muy cortas puede sumar rápidamente en algunos casos.

El comportamiento predeterminado del motor es restringir el uso de una sesión al mismo subproceso desde el momento en que se realiza la primera llamada a JetBeginTransaction hasta el momento en que se realiza la llamada coincidente a JetCommitTransaction o JetRollback . Este comportamiento se puede cambiar para quitar esta restricción estableciendo un contexto de sesión personalizado mediante JetSetSessionContext y JetResetSessionContext.

El motor de base de datos también admite modificaciones de esquema transaccional. Por ejemplo, es posible iniciar una nueva transacción, crear una tabla, agregar algunas columnas, crear un índice o dos y, a continuación, anular la transacción. Los elementos de esquema que acaba de agregar se quitarán de la base de datos. También es posible mezclar modificaciones de esquema y actualizaciones normales de la base de datos en la misma transacción.

Requisitos

Requisito Value

Cliente

Requiere Windows Vista, Windows XP o Windows 2000 Professional.

Servidor

Requiere Windows Server 2008, Windows Server 2003 o Windows 2000 Server.

Encabezado

Declarado en Esent.h.

Library

Use ESENT.lib.

Archivo DLL

Requiere ESENT.dll.

Consulte también

JET_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
Parámetros del sistema