campo mysql database error-handling

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".