Saltar al contenido

Diferencia entre SET autocommit=1 y START TRANSACTION en mysql (¿Me he perdido algo?)

Estate atento ya que en esta reseña vas a hallar el arreglo que buscas.

Solución:

Estar al tanto del manejo de transacciones (autoconfirmación, explícita e implícita) 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 el uso de 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 ignora cualquier acción que haya tenido lugar dentro de la transacción – muy deseable cuando una declaración UPDATE/DELETE 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 hecho explícito COMMIT 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 una 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 hayan sido probados y se haya determinado completamente que son válidos.

Eso significa que debes usar:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

… y solo uso 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 que sean correctos previo a intentar la instrucción UPDATE/DELETE.

Apéndice

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.

En InnoDB tu tienes START TRANSACTION;que en este motor es la forma oficialmente recomendada para realizar transacciones, en lugar de SET AUTOCOMMIT = 0; (no usar SET AUTOCOMMIT = 0; para transacciones en InnoDB a menos que sea para optimizar solo lectura actas). Comprometerse con COMMIT;.

Es posible que desee utilizar SET AUTOCOMMIT = 0; en InnoDB con fines de prueba, y no precisamente para transacciones.

En MiISAM usted no tiene START TRANSACTION;. En este motor, use SET AUTOCOMMIT = 0; para transacciones. Comprometerse con COMMIT; o SET AUTOCOMMIT = 1; (La diferencia se explica en el comentario de ejemplo de MyISAM a continuación). También puede realizar transacciones de esta manera en InnoDB.

Fuente: http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit

Ejemplos de transacciones de uso general:

/* InnoDB */
START TRANSACTION;

INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');

COMMIT; /* SET AUTOCOMMIT = 1 might not set AUTOCOMMIT to its previous state */

/* MyISAM */
SET AUTOCOMMIT = 0;

INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');

SET AUTOCOMMIT = 1; /* COMMIT statement instead would not restore AUTOCOMMIT to 1 */

https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html

La forma correcta de usar LOCK TABLES y UNLOCK TABLES con tablas transaccionales, como las tablas de InnoDB, es comenzar una transacción con SET autocommit = 0 (no START TRANSACTION) seguido de LOCK TABLES, y no llamar a UNLOCK TABLES hasta que confirme la transacción. explícitamente. Por ejemplo, si necesita escribir en la tabla t1 y leer de la tabla t2, puede hacer esto:

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

Reseñas y puntuaciones de la guía

Puedes añadir valor a nuestro contenido colaborando tu veteranía en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *