campo - mysql server varchar max
¿Hay un equivalente para @@ error de SQL Server en MySQL (3)
BEGIN;
UPDATE foo SET bar = 3;
UPDATE bar SET thing = 5;
COMMIT;
Si se produce un error, la transacción completa se retrotraerá automáticamente. Realmente solo necesita ejecutar ROLLBACK
si algo en su aplicación indica la necesidad de deshacer.
Es posible manejar errores explícitamente dentro de procedimientos o declaraciones compuestas en MySQL, pero no recomendaría seguir esta ruta. Vea este artículo de cómo hacerlo y los documentos para DECLARE HANDLER . También deberá encontrar el código de error específico que desea manejar , o puede usar la condición general de SQLEXCEPTION
. También querrás revisar las declaraciones compuestas y definir los programas almacenados .
De todos modos, en base a los documentos, podría hacer algo como la siguiente consulta, pero honestamente no haría nada diferente a mi respuesta anterior. También obtendrá looks muy extraños de cualquiera que use MySQL (incluido yo mismo).
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
UPDATE foo SET bar = 3;
UPDATE bar SET thing = 5;
COMMIT;
END;
Respuesta anterior:
Si está ejecutando una sola consulta, esto no tiene sentido. Simplemente ejecuta la consulta; si ocurre un error, no ocurrirá nada: su transacción se retrotraerá automáticamente.
La razón es que, por defecto, todas las consultas individuales están envueltas en una transacción "oculta", llamada modo "autocommit" en MySQL. La alternativa típica es usar transacciones explícitamente: una vez que ejecuta "COMENZAR", ha iniciado una transacción. Una vez que hagas COMMIT o ROLLBACK, volverás al modo de confirmación automática.
Entonces, la única razón para utilizar una transacción en MySQL es si desea retroceder a un estado particular cuando ocurre un error (u otro evento externo). En MySQL, una transacción siempre se anula si ocurre un error.
Por último, es posible desactivar este comportamiento por completo, y luego debe usar transacciones explícitamente en todo momento. Creo que "COMENZAR" está implícito desde la última vez que se comprometió o revertió, pero debe COMPROMETERSE o ROLLBACK cualquier consulta que ejecute.
Vea El Modelo de Transacción InnoDB en el manual de MySQL para más información.
Quiero ejecutar una consulta de actualización en una base de datos de producción y, como buen pequeño desarrollador, intento que sea lo más seguro posible. Estoy buscando hacer lo siguiente
BEGIN TRANSACTION
UPDATE table_x SET col_y = ''some_value''
.
.
.
IF (@@error <> 0)
BEGIN
ROLLBACK
END
ELSE
BEGIN
COMMIT
END
Lo anterior debería funcionar en SQL Server pero necesito que esto funcione contra una base de datos MySQL.
EDITAR: Lo siento, hay más de 1 declaración para ejecutar. Sí, soy consciente de que no es necesario envolver una sola consulta en una transacción.
CREATE PROCEDURE prc_test()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;
INSERT
INTO t_test VALUES (''test'', ''test'');
INSERT
INTO no_such_table
VALUES (''no'');
COMMIT;
END;
CALL prc_test();
SELECT *
FROM t_test;
0 rows fetched.
No creo que esto sea necesario, ya que existe el concepto de compromiso / desmantelamiento implícito.
De los documentos de MySQL :
Por defecto, MySQL inicia la sesión para cada nueva conexión con el modo de confirmación automática habilitado, por lo que MySQL realiza una confirmación después de cada declaración de SQL si esa declaración no devuelve un error. Si una instrucción devuelve un error, el comportamiento de compromiso o retrotracción depende del error. Consulte la Sección 13.6.13, "Manejo de errores de InnoDB".