Si una transacción se "confirma", ¿se guarda con seguridad?

12

Si una transacción se confirma correctamente, ¿puedo estar 100% seguro de que se ha escrito en la base de datos Y en los archivos de registro? ¿Puedo estar seguro de que los datos se GUARDAN?

Hoy nuestros archivos de registro habían alcanzado el límite de la unidad y obtuvimos muchos errores. Además, algunos otros servicios colapsaron. Aumentamos el disco y reiniciamos el servidor.

Durante el inicio, el servidor realizó una "recuperación de la base de datos". ¿Puedo estar seguro de que todo vuelve a estar bien?

Policía de SQL
fuente
2
Puede verificar el registro de errores después de que se complete la recuperación para ver cuántas transacciones se confirmaron y cuántas se revertieron. No hay una respuesta mágica a esto: si un disco falla, entonces todo depende del estado de las transacciones en ese momento.
Aaron Bertrand
1
@AaronBertrand Pero si una transacción está en estado "comprometida" (es decir, la confirmación fue exitosa), ¿cómo podría ser posible que todavía se pierda durante la recuperación?
Policía SQL
3
@Giosco: no puede. "comprometido" significa que está en el archivo de registro de la base de datos. La única forma de perderlo después de eso es 1) perder el archivo de registro antes de que también se guarde en el archivo de datos, o 2) perder el archivo de registro y el archivo de datos, o 3) error humano. Tenga en cuenta que (3) suele ser el más probable.
RBarryYoung
2
@Giosco, ¿cómo sabe que todas sus transacciones en el momento de la unidad completa se comprometieron con éxito?
Aaron Bertrand
2
Transacción de procedimiento almacenado <>: su procedimiento almacenado puede tener varias transacciones explícitas, o solo implícitas, podría haber una lógica de prueba / captura, podría haber un manejo de transacciones en la capa C #, etc., etc. podría ser un poco demasiado peligroso como una declaración general.
Aaron Bertrand

Respuestas:

16

Si una aplicación cliente ha emitido un COMMIT y ha recuperado un código de éxito, el motor garantiza que la transacción sea duradera. Se garantiza que todos los cambios realizados en una transacción serán visibles, incluso después de un bloqueo. Además, la recuperación también garantiza que cualquier transacción no comprometida se revertirá en caso de un bloqueo.

Para más detalles, recomiendo leer el artículo de ARIES .

El registro y la recuperación de escritura anticipada no pueden garantizar si el hardware de almacenamiento subyacente tiene fallas (corrupción). Y cualquier producto de ingeniería puede contener defectos.

Su aplicación, como todas las demás aplicaciones, debe escribirse cuidadosamente para que se comporte correctamente en presencia de bloqueos (errores). No hay magia

Remus Rusanu
fuente
Si una aplicación cliente ha emitido un COMMIT pero no se recibe respuesta de DB hasta el tiempo de espera del lado del cliente. ¿Qué hay de este compromiso? ¿éxito o fracaso? ¿Como revisar?
Gab 是 好人