Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la actualización en disco.
Si usa tablas transaccionales (como InnoDB
o
BDB
), puede desactivar el modo autocommit con
el siguiente comando:
SET AUTOCOMMIT=0;
Tras deshabilitar el modo autocommit poniendo la variable
AUTOCOMMIT
a cero, debe usar
COMMIT
para almacenar los cambios en disco o
ROLLBACK
si quiere ignorar los cambios hechos
desde el comienzo de la transacción.
Si quiere deshabilitar el modo autocommit para una serie única
de comandos, puede usar el comando START
TRANSACTION
:
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
Con START TRANSACTION
, autocommit permanece
deshabilitado hasta el final de la transacción con
COMMIT
o ROLLBACK
. El modo
autocommit vuelve a su estado prévio.
BEGIN
y BEGIN WORK
se
soportan como alias para START TRANSACTION
para iniciar una transacción. START
TRANSACTION
es sintaxis SQL estándar y es la forma
recomendada para iniciar una transacción ad-hoc . El comando
BEGIN
difiere del uso de la palabra clave
BEGIN
que comienza un comando compuesto
BEGIN ... END
. El último no comienza una
transacción. Consulte Sección 19.2.7, “Sentencia compuesta BEGIN ... END
”.
Puede comenzar una transacción así:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
La cláusula WITH CONSISTENT SNAPSHOT
comienza una lectura consistente para motores de almacenamiento
capaces de ello. Actualmente, esto se aplica sólo a
InnoDB
. El efecto es el mismo que realizar un
START TRANSACTION
seguido por un
SELECT
desde cualquier tabla
InnoDB
. Consulte
Sección 15.10.4, “Lecturas consistentes que no bloquean”.
Comenzar una transacción provoca que se realice un
UNLOCK TABLES
implícito.
Tenga en cuenta que si no usa tablas transaccionales, cualquier cambio se almacena de golpe, a pesar del estado del modo autocommit .
Si realiza un comando ROLLBACK
tras
actualizar una tabla no transaccional dentro de una
transacción, ocurre una advertencia
ER_WARNING_NOT_COMPLETE_ROLLBACK
. Los cambios
en tablas transaccionales se deshacen, pero no los cambios en
tablas no transaccionales.
Cada transacción se almacena en el log binario en un trozo,
hasta COMMIT
. Las transacciones que se
deshacen no se loguean. (Exceción: Las
modificaciones a tablas no transaccionales no pueden deshacerse.
Si una transacción que se deshace incluye modificaciones a
tablas no transaccionales, la transacción entera se loguea con
un comando ROLLBACK
al final para asegurar
que las modificaciones a estas tablas se replican.) Consulte
Sección 5.10.3, “El registro binario (Binary Log)”.
Puede cambiar el nivel de aislamiento para transacciones con
SET TRANSACTION ISOLATION LEVEL
. Consulte
Sección 13.4.6, “Sintaxis de SET TRANSACTION
”.
Deshacer puede ser una operación lenta que puede ocurrir sin
que el usuario lo haya pedido explícitamente (por ejemplo,
cuando ocurre un error). Debido a ello, SHOW
PROCESSLIST
en MySQL 5.0 muestra Rolling
back
en la columna State
para la
conexión durante rollbacks implícitos y explícitos (comando
SQL ROLLBACK
).
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.