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