Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

No funciona el COMMIT

Estas en el tema de No funciona el COMMIT en el foro de Mysql en Foros del Web. Código: DELIMITER $$ DROP PROCEDURE IF EXISTS `SP_ADD_CLIENT` $$ CREATE PROCEDURE `SP_ADD_CLIENT`(firstname VARCHAR(50), lastname VARCHAR(50), email VARCHAR(50)) BEGIN DECLARE idUser INT; DECLARE a INT; INSERT ...
  #1 (permalink)  
Antiguo 05/04/2008, 00:21
 
Fecha de Ingreso: mayo-2004
Ubicación: Santiago, Chile
Mensajes: 191
Antigüedad: 19 años, 11 meses
Puntos: 1
No funciona el COMMIT

Código:
DELIMITER $$

DROP PROCEDURE IF EXISTS `SP_ADD_CLIENT` $$
CREATE PROCEDURE `SP_ADD_CLIENT`(firstname VARCHAR(50), lastname VARCHAR(50), email VARCHAR(50))

BEGIN
DECLARE idUser INT;
DECLARE a INT;

INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAIL) VALUES (firstname, lastname, email,CURDATE() );

SET idUser = LAST_INSERT_ID();

INSERT INTO STUDIO (ID_CL, NAME_ST)
	VALUES (idUser, name_st);

INSERT INTO ME_EQUIVOCO (ID_CL, ID_PL, ADDED)
	VALUES (idUser, 1, CURDATE());

SET a=(SELECT @@error_count);
IF a=0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;

END $$
Tengo este código, en donde a propósito me equivoco (lo que esta en negrita) pero aún asi me graba la informacion en STUDIO.

En otro POST me dijeron que tenia que poner STAR TRANSACTION en vez de BEGIN, pero con eso, la consola de MySQL 5 me arroja un error.

Como es para efectivamente en MySQL 5 trabajar con las transacciones COMMIT y ROLLBACK??
  #2 (permalink)  
Antiguo 05/04/2008, 08:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Re: No funciona el COMMIT

La cosa tiene dos partes:
1. No es que tengas que poner STAR TRANSACTION en vez de BEGIN. Tienes que poner STAR TRANSACTION después de BEGIN. El BEGIN inicia el procedure, START TRANSACTION inicia la transacción.
2. No aclaraste qué tipo de tablas estás usando. Si usas InnoDB, perfecto, pero asegúrate de no tener AUTOCOMMIT en 1. Si usas MyISAM, olvídalo, no admiten transacciones.
  #3 (permalink)  
Antiguo 12/04/2008, 22:28
 
Fecha de Ingreso: mayo-2004
Ubicación: Santiago, Chile
Mensajes: 191
Antigüedad: 19 años, 11 meses
Puntos: 1
Re: No funciona el COMMIT

No me funciona =(

Lo dejo asi

Código:
DELIMITER $$

DROP PROCEDURE IF EXISTS `SP_ADD_CLIENT` $$
CREATE PROCEDURE `SP_ADD_CLIENT`(firstname VARCHAR(50), lastname VARCHAR(50), email VARCHAR(50))

BEGIN
START TRANSACTION;
SET AUTOCOMMIT=0;

DECLARE idUser INT;
DECLARE a INT;

INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAIL) VALUES (firstname, lastname, email,CURDATE() );

SET idUser = LAST_INSERT_ID();

INSERT INTO STUDIO (ID_CL, NAME_ST)
	VALUES (idUser, name_st);

INSERT INTO ME_EQUIVOCO (ID_CL, ID_PL, ADDED)
	VALUES (idUser, 1, CURDATE());

SET a=(SELECT @@error_count);
IF a=0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;

END $$
Pero sigue arrojandome error. La base de datos claramente es InnoDB, y como vez, el autocommit lo dejo en 0.

ERROR
Código:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'DECLA
RE idUser INT;
DECLARE a INT;
INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAI' at line 5
Que más puede ser?
  #4 (permalink)  
Antiguo 10/05/2009, 23:51
 
Fecha de Ingreso: mayo-2009
Mensajes: 13
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Re: No funciona el COMMIT

Cita:
Iniciado por Punchi Ver Mensaje
No me funciona =(

Lo dejo asi

Código:
DELIMITER $$

DROP PROCEDURE IF EXISTS `SP_ADD_CLIENT` $$
CREATE PROCEDURE `SP_ADD_CLIENT`(firstname VARCHAR(50), lastname VARCHAR(50), email VARCHAR(50))

BEGIN
START TRANSACTION;
SET AUTOCOMMIT=0;

DECLARE idUser INT;
DECLARE a INT;

INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAIL) VALUES (firstname, lastname, email,CURDATE() );

SET idUser = LAST_INSERT_ID();

INSERT INTO STUDIO (ID_CL, NAME_ST)
	VALUES (idUser, name_st);

INSERT INTO ME_EQUIVOCO (ID_CL, ID_PL, ADDED)
	VALUES (idUser, 1, CURDATE());

SET a=(SELECT @@error_count);
IF a=0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;

END $$
Pero sigue arrojandome error. La base de datos claramente es InnoDB, y como vez, el autocommit lo dejo en 0.

ERROR
Código:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'DECLA
RE idUser INT;
DECLARE a INT;
INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAI' at line 5
Que más puede ser?
  #5 (permalink)  
Antiguo 10/05/2009, 23:59
 
Fecha de Ingreso: mayo-2009
Mensajes: 13
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: No funciona el COMMIT

CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_ADD_CLIENT`(firstname VARCHAR(50), lastname VARCHAR(50), email VARCHAR(50))
BEGIN
DECLARE idUser INT;
DECLARE a INT;

SET AUTOCOMMIT=0;
START TRANSACTION;

INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAIL) VALUES (firstname, lastname, email);

SET idUser = LAST_INSERT_ID();

INSERT INTO STUDIO (ID_CL, NAME_ST)
VALUES (idUser, name_st);

INSERT INTO ME_EQUIVOCO (ID_CL, ID_PL, ADDED)
VALUES (idUser, 1, CURDATE());

SET a=(SELECT @@error_count);
IF a=0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;

END;


Llega perfectamente al COMMIT pero cuando ocurre un error en la tabla o en una insercion jamas llega al ROLLBACK, repito cuando hay error no jamas llega al ROLLBACK alguien podria a yudarme? de antemano gracias
  #6 (permalink)  
Antiguo 11/05/2009, 04:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: No funciona el COMMIT

1. Estás usando el mismo nombre para los campos de la tabla que para las variables. MySQL no puede diferenciarlos y por una cuestión jerárquica le da prioridad a los de las columnas y termina sin insertar nada. Cambia los de las variables por otros.
2. La variable de sistema @@error_count no existe, al menos en MySQL. Los errores de los SP se controlan con los HANDLER, los que se deben declarar después de las variables y cursores (si se usan) y antes de cualquier sentencia del cuerpo.
3. Los parámetros del SP no tienen indicado si son de entrada (IN), entrada salida (INOUT) o salida (OUT). En MySQL es mandatorio. Solamente las store functions no los tienen porque siempre son de entrada.
4. Si estás entrando el SP por consola o por script, está faltando el manejo de los DELIMITER.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 12/05/2009, 13:32
 
Fecha de Ingreso: mayo-2009
Mensajes: 13
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: No funciona el COMMIT

Ok mira aqui esta el Store Bien Redactado

DROP PROCEDURE IF EXISTS `univalle`.`SP_ADD_CLIENT`;

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `univalle`.`SP_ADD_CLIENT`(IN nombre VARCHAR(50),IN apellido VARCHAR(50),IN correo VARCHAR(50))
BEGIN
DECLARE idUser INT;
DECLARE a INT;

SET AUTOCOMMIT=0;
START TRANSACTION;

INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAIL) VALUES (nombre, apellido, correo);

SET idUser = LAST_INSERT_ID();

INSERT INTO STUDIO (ID_CL, NAME_ST)
VALUES (idUser, name_st);

INSERT INTO ME_EQUIVOCO (ID_CL, ID_PL, ADDED)
VALUES (idUser, 1, CURDATE());

SET a=(SELECT @@error_count);
IF a=0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;

END $$

DELIMITER ;

Pero sigue sin llegar al ROLLBACK, me llamo la atencion tu comentario sobre que la variable @@error_count no existe, probe tambien poniendo show count(*) ERRORS pero tampoco funciona. Tomando tu comentario como base probe haciendo lo siguiente:


DROP PROCEDURE IF EXISTS `univalle`.`SP_ADD_CLIENT`;

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_ADD_CLIENT`(nombre VARCHAR(50), apellisdo VARCHAR(50), email VARCHAR(50))
BEGIN
DECLARE idUser INT;
DECLARE a INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'Error occurred ? terminating';
END;

SET AUTOCOMMIT=0;
START TRANSACTION;

INSERT INTO CLIENT (FIRSTNAME, LASTNAME, EMAIL) VALUES (nombre,apellido, correo);

SET idUser = LAST_INSERT_ID();

INSERT INTO STUDIO (ID_CL, NAME_ST)
VALUES (idUser, name_st);

INSERT INTO ME_EQUIVOCO (ID_CL, ID_PL, ADDED)
VALUES (idUser, 1, CURDATE());

COMMIT;

END $$

DELIMITER ;

Ok el Stored Procedure se executa muy bien, Cuando hay Error se ejecuta el ROLLBACK y cuando no se ejecuta el COMMIT, pero me gustaria saber ahora como puedo manejar el mensaje de error de manera automatica, es decir, que me entregue ya sea el mensaje de error por defecto de ese error o el numero de error, para tratarlo posteriormente con PHP.
  #8 (permalink)  
Antiguo 12/05/2009, 19:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: No funciona el COMMIT

Bueno, aquí la cosa se vuelve más específica, pero también mucho más simple.
El caso es que cada ejecución de una sentencia SQL siempre devuelve algún tipo de información, eso lo has de saber. Puntualmente, una sentencia de INSERT o UPDATE devuelve un numero natural positivo equivalente a la cantidad de registros afectados por la ejecución. Eso sucede cuando capturas la salida de una ejecución via PHP o VB.net en una variable. Es la forma más simple de retener el resultado sin errores.
Pero por la misma via, el MySQL también puede devolver un número de error, o una condición entre todas las que se han clasificado. Eso es lo que debes recuperar. Pero eso es un asunto de programación PHP y se excede de los límites de este foro (cuestiones de reglas), para mejores respuestas, es mejor que postees en el Foro PHP.
De todos modos como referencia te digo:
1. La ejecución de una sentencia (que bien puede ser un SP) desde PHP devuelve mysql_error()
2. Los numeros de error también son administrables directamente desde PHP.
3. Es muy posible que haciendo uso de las funciones que están en los links que te estoy poniendo, no necesites usar un SP.
Medítalo.

Tenme al tanto de como va esto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:51.