Nuestra aplicación dispara una consulta INSERT a la base de datos MySQL para agregar registros. Quiero saber si los registros se auto-confirman o no. Si ejecuto el comando ROLLBACK, ¿cuándo realiza la reversión la base de datos? ¿Es posible un ROLLBACK después de un COMMIT?
13
Respuestas:
La respuesta a su pregunta depende de si está o no dentro de una transacción que abarcará más de un estado de cuenta. (Ha etiquetado la pregunta con InnoDB, la respuesta sería diferente con MyISAM).
Del manual de referencia: http://dev.mysql.com/doc/refman/5.1/en/commit.html
Entonces, sí, de manera predeterminada, si solo está usando
INSERT
, los registros que inserte se confirmarán, y no tiene sentido intentar revertirlos. (Esto es efectivamente lo mismo que envolver cada declaración entreBEGIN
yCOMMIT
.)Sin embargo, si se trata de transacciones explícitamente, tendrá que usar
COMMIT
para confirmar almacenar los registros, pero también podrá usarROLLBACK
.Puede iniciar una transacción explícitamente usando
START TRANSACTION
(oBEGIN
). Esto es independiente de laautocommit
configuración (activada de forma predeterminada):Alternativamente, si
autocommit=0
, creo que cualquier declaración después de otro final de la transacción, comenzará una transacción (pero aún puede usarlaSTART TRANSACTION
explícitamente); esa es al menos la forma en que interpreto esto :Más específicamente, "otra forma de comenzar una transacción" parece implicar que establecer "autocommit = 0" es suficiente para iniciar una transacción (al menos justo antes de cada declaración al inicio de una sesión o que sigue a
COMMIT
/ROLLBACK
). Sugeriría usar de manera explícitaBEGIN
o deSTART TRANSACTION
todos modos, incluso si es asíautocommit=0
, ya que puede ser más claro ver cuándo comienza o termina la transacción.(La forma en que inicia una transacción puede depender de la forma en que su aplicación usa MySQL).
fuente
Por defecto, InnoDB está configurado para autocommitir = 1 u ON . Una vez cometidos, no se pueden revertir .
Tendría que hacer una de dos cosas para deshabilitarlo en el futuro:
OPCIÓN 1: Agregue esto a /etc/my.cnf y reinicie mysql
OPCIÓN 2: Realice uno de estos en la conexión de base de datos abierta antes de comenzar cualquier SQL significativo
Bajo estas dos opciones, tendría que realizar un COMMIT manual o un ROLLBACK manual .
CONSIDERACIÓN
Si la tabla es MyISAM, entonces la explicación es más simple. Como no hay transacciones para el motor de almacenamiento MyISAM, todos los INSERT, UPDATE y DELETE ejecutados son permanentes. No hay retrocesos en absoluto.
fuente