Hay dos lecciones que aprender aquí:
- Datos de copia de seguridad
- Realice declaraciones UPDATE/DELETE dentro de una transacción, para que pueda usar
ROLLBACK
si las cosas no salen según lo planeado
Estar al tanto del manejo de transacciones (compromiso automático, explícito e implícito) para su base de datos puede evitar que tenga que restaurar datos desde una copia de seguridad.
Las transacciones controlan las declaraciones de manipulación de datos para garantizar que sean atómicas. Ser "atómico" significa que la transacción ocurre o no. La única forma de señalar la finalización de la transacción a la base de datos es mediante un COMMIT
o ROLLBACK
declaración (según ANSI-92, que lamentablemente no incluía la sintaxis para crear/comenzar una transacción, por lo que es específica del proveedor). COMMIT
aplica los cambios (si los hay) realizados dentro de la transacción. ROLLBACK
no tiene en cuenta las acciones que tuvieron lugar dentro de la transacción; muy recomendable cuando una instrucción ACTUALIZAR/ELIMINAR hace algo no deseado .
Por lo general, las declaraciones DML (Insertar, Actualizar, Eliminar) individuales se realizan en una transacción de confirmación automática; se confirman tan pronto como la declaración se completa con éxito. Lo que significa que no hay oportunidad de revertir la base de datos al estado anterior a la ejecución de la declaración en casos como el suyo. Cuando algo sale mal, la única opción de restauración disponible es reconstruir los datos a partir de una copia de seguridad (siempre que exista una). En MySQL, la confirmación automática es en por defecto para InnoDB - MyISAM no admite transacciones. Se puede deshabilitar usando:
SET autocommit = 0
Una transacción explícita es cuando las declaraciones se envuelven dentro de un bloque de código de transacción definido explícitamente - para MySQL, eso es START TRANSACTION
. También requiere un COMMIT
hecho explícitamente o ROLLBACK
declaración al final de la transacción. Las transacciones anidadas están fuera del alcance de este tema.
Las transacciones implícitas son ligeramente diferentes de las explícitas. Las transacciones implícitas no requieren definir explícitamente una transacción. Sin embargo, al igual que las transacciones explícitas, requieren un COMMIT
o ROLLBACK
Declaración a suministrar.
Conclusión
Las transacciones explícitas son la solución más ideal:requieren una declaración, COMMIT
o ROLLBACK
, para finalizar la transacción, y lo que está sucediendo se indica claramente para que otros lo lean en caso de que sea necesario. Las transacciones implícitas están bien si se trabaja con la base de datos de forma interactiva, pero COMMIT
Las declaraciones solo deben especificarse una vez que los resultados se hayan probado y se haya determinado exhaustivamente que son válidos.
Eso significa que debes usar:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...y solo usa COMMIT;
cuando los resultados son correctos.
Dicho esto, las declaraciones UPDATE y DELETE generalmente solo devuelven la cantidad de filas afectadas, no detalles específicos. Convierta dichas declaraciones en declaraciones SELECT y revise los resultados para garantizar la corrección previa a intentar la instrucción UPDATE/DELETE.
Anexo
Las declaraciones DDL (lenguaje de definición de datos) se confirman automáticamente; no requieren una declaración COMMIT. IE:tablas, índices, procedimientos almacenados, bases de datos y declaraciones de creación o modificación de vistas.