A menudo veo declaraciones como el registro del servidor SQL registra cada transición y operación.
Pero estoy confundido acerca de lo que sucede cuando una transacción es finalmente rodó hacia atrás .
Por ejemplo una transacción explícita tiene 3 estados: statement A
, statement B
, statement C
, y finalmente una rollback
statement D
.
Ahora diga cuando la ejecución no haya alcanzado el rollback statement D
, ¿ statements A through C
se registrarán las modificaciones resultantes del registro del servidor SQL?
Comprensión 1 :
Las declaraciones de la A a la D se graban. SQL Server registra todo, pase lo que pase.
Comprensión 2 : las modificaciones solo se almacenan en algún lugar de la memoria y solo se registran para iniciar sesión cuando SQL Server ve una commit
declaración. Si resulta ser una rollback
declaración, SQL Server simplemente ignora la transacción, no se realiza ninguna escritura en el registro porque no sirve para nada. En otras palabras, SQL Server se registra cuando hay un resultado neto antes y después de las transacciones.
Ambas me parecen lógicas, al menos para mí, pero ambas no pueden estar en lo cierto. Gracias por cualquier ayuda.
fuente
Respuestas:
Entender 1 es correcto. SQL Server registra cada operación que cambia los datos al registro de transacciones. Una reversión es un cambio en los datos, por lo que también se registra en el registro de transacciones. Como ejecución de la declaración A, escribirá datos en el registro de transacciones y también reservará datos en el registro de transacciones en caso de que la declaración A deba revertirse. Lo mismo es cierto para B y C. Cuando revierta la transacción, se escribirá más información en el registro.
Hay muchas maneras de ver esto en acción, así que a continuación se muestra una demostración rápida. Aquí está la consulta que usaré para ver lo que se escribió en el registro:
Mi mesa:
La consulta A usa un registro mínimo:
Después de:
La consulta B no usa un registro mínimo:
Después de B:
La consulta C cambia menos datos:
Después de C:
Ahora emitiré
ROLLBACK
y consultaré el DMV mientras ocurre la reversión. A continuación se muestra una tabla de algunas instantáneas:Durante el
ROLLBACK
, los bytes utilizados aumentan y el número reservado de bytes disminuye. Esto se debe a que SQL Server está utilizando el espacio que reservaba antes para deshacer la transacción. Para deshacer la transacción, debe cambiar los datos para que escriba más datos en el registro.fuente
Las modificaciones en las tablas de la base de datos se escriben primero en el archivo de registro, luego en las tablas mismas, primero en la memoria y luego, con un proceso asíncrono llamado
CHECKPOINT
, en el disco. Este mecanismo se conoce como WAL (Registro de escritura anticipada) y es común a todas las bases de datos relacionales.El registro en sí se escribe primero en la memoria (en el búfer de registro, precisamente) y luego en el disco, pero no se toca nada en las tablas de la base de datos hasta que el registro se haya escrito en el disco.
Este mecanismo permite tanto el avance de las transacciones confirmadas como el retroceso de las transacciones no confirmadas durante el proceso de recuperación. Con respecto a su ejemplo, si algo malo sucedió después
statement C
y tuvo un encommit
lugar de unrollback
(no puede saber esto de antemano), sin guardar todos y cada uno de los pasos en la transacción, el RDBMS no tendría forma de recuperar la base de datos de manera consistente manera y la transacción no cumpliría con laD
(durabilidad) enACID
.Cuando algunas operaciones se revierten, es el archivo de datos el que recibe los cambios netos (vía
CHECKPOINT
), no el archivo de registro.fuente
Entender 1 es correcto, y spaghettidba y Joe tienen buenas explicaciones.
Si está interesado en probar usted mismo (en una instancia de prueba, por favor), puede usar el siguiente script:
Verá que SQL Server registra todo, incluso los pasos dados para deshacer las operaciones.
fuente