entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Verificacion de Transaccion MySQL

Hola, recien estoy usando mysqli, y queria que ustedes revisen mi codigo ya que es la primera vez que uso transacciones en php

 DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `insertarUsuario`(in dni int, in nombre varchar(50),in apellido varchar(150)
, in password varchar(32), in puesto varchar(30), in priv int,in habilitado int, in id_sucursal int)
begin

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
SELECT 1 as error; 
ROLLBACK; 
END; 

/*Handler para error SQL*/ 
DECLARE EXIT HANDLER FOR SQLWARNING 
BEGIN 
SELECT 1 as error; 
ROLLBACK; 
END; 

/*Inicia transaccion*/ 
START TRANSACTION; 

    insert into usuarios(dni,nombre,apellido,password,puesto,priv,habilitado,id_sucursal) values (dni,nombre,apellido,password,puesto,priv,habilitado,id_sucursal);

commit;

SELECT 0 as error; 
end

De hecho lo he puesto en un procedimiento almacenado, tampoco se si sea buena idea, agradeceria opiniones :)

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Christian,

a simple vista, el código no tiene nada de mal, sin embargo es innecesario.

La idea de una transacción es englobar varias operaciones sobre la DB como si fueran una sola, para no dejar una inserción, una actualización o un borrado a medias cuando están afectadas varias tablas o registros.

En tu caso, solo hay un INSERT, que por definición es una tarea atómica, así que todo esto (al menos así como está) es superfluo y complica el código haciéndolo más difícil de mantener.

Si solo es una prueba de concepto, adelante! Es este el camino.

Por otra parte, podés desde PHP ahorrarte escribir procedimientos almacenados y todo eso, porque podés usar el método $mysqli->autocommit(FALSE);, luego poner un montód de querys, como siempre, y al final llamar a $mysqli->commit(). Esto hace que todas las querys sean parte de una transacción.

Acá hay un ejemplo de código: http://www.php.net/manual/es/mysqli.commit.php

Saludos!

0voto

christian_avalos comentado

Si, me acabo de dar cuenta que deberia ser un transact y adentro varios insert (u operaciones) y leyendo el ejemplo, tengo una duda

<?php
$all_query_ok=true; // our control variable

//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE

//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();

$mysqli->close();
?>

todo ese codigo se considera una transaccion como tal?

0voto

Leonardo-Tadei comentado

Hola Christian,

en ese ejemplo los 4 INSERT son una única transacción: el 4to falla por key violation al hacer el commit, y opr tanjto se ejecuta el rollback, con lo que los primeros 3 INSERT se reversan.

El ejemplo no es muy práctico, en el sentido que no parece un ejemplo real tirar 4 INSERT a la misma tabla, y el operador trinario lo hace innecesariamente difícil de leer... pero es código válido.

Saludos!

PD: si la respuesta a la pregunta te parece válida, seleccionala así el tema queda cerrado.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta