javoaxian cambió a: javoaxian.me
Este blog se mantendrá como histórico del nuevo javoaxian.me. Por tal motivo, sólo serán creados post que harán referencia a los del nuevo blog. Si hay dudas y comentarios, favor de hacerlos en javoaxian.me.

domingo, 25 de mayo de 2008

Manejar transacciones con ADOdb para PHP

La forma de usar transacciones con ADOdb para PHP es muy sencilla.

Lo primero que se deberá de hacer después de crear la conexión, es iniciar la transacción. Posteriormente ejecutar las sentencias sql que queremos que entren dentro de la transacción y verificar si se hicieron correctamente, en caso de no ser así deberemos lanzar una instrucción Rollback, y en caso de que todo estuvo bien, deberemos lanzar una instrucción Commit.

$bd = NewADOConnection('mysql');
$conexion = $bd->Connect("servidor","usuarioBD","contraseniaBD","nombreBD"));
$conexion->BeginTrans();
$insert1 = "INSERT INTO ....";
$insert2 = "INSER INTO ....";

if(!$conexion->Execute($insert1))
$conexion->RollbackTrans();
elseif(!$conexion->Execute($insert2))
$conexion->RollbackTrans();
else
$conexion->CommitTrans();

$conexion->Close();

Como se puede observar, tenemos que ir rastreando los posibles errores de nuestras instrucciones sql para lanzar nuestros Rollback igual que como lo haríamos normalmente con sql.

Afortunadamente esta biblioteca nos facilita un poco más el uso de transacciones gracias al uso de lo que en su página llaman Transacciones Inteligentes.

Las transacciones inteligentes nos permiten iniciar y concluir nuestra transacción sin necesidad de ir rastreando los posibles errores, bastará con usar el método StartTrans() el cual permite iniciar la transacción y poner donde queramos que inicie nuestra transacción el método CompleteTrans(). Este último método, se encarga de verificar si hubo algún error en las instrucciones sql que están dentro de la transacción y, si detecta algún error, entonces lanza automáticamente una instrucción Rollback, en caso contrario lanza una instrucción Commit.

El ejemplo anterior, puede quedar de la siguiente manera:

$bd = NewADOConnection('mysql');
$conexion = $bd->Connect("servidor","usuarioBD","contraseniaBD","nombreBD"));
$conexion->StartTrans();
$insert1 = "INSERT INTO ....";
$insert2 = "INSER INTO ....";

$conexion->Execute($insert1);
$conexion->Execute($insert2);

$conexion->CompleteTrans();
$conexion->Close();

Como podemos observar, es mucho más fácil usar transacciones con esta última forma.

Ahora bien si de todas maneras, necesitamos por alguna razón lanzar una instrucción Rollback en una transacción inteligente, podemos usar el método FailTrans().

$conexion->FailTrans();

Este método le indica al método CompleteTrans() que deberá lanzar un Rollback.

Para finalizar esta entrada, me gustaría mencionar que en los manejadores de bases de datos que he usado (PostgreSQL, Oracle, Sybase y MySQL), las transacciones inteligentes trabajan sin problema con excepción de MySQL, ya que para que funcionen las transacciones inteligentes con este manejador, deberemos especificar el driver mysqlt en lugar de mysql cuando creamos el objeto de conexión.

$bd = NewADOConnection('mysqlt');

Hace mucho use esta opción pero ya no la recordaba, por eso agradezco al joven Alvajandro que me recordó la opción para poder usar este tipo de transacciones con MySQL.

También recuerden que para que funcionen transacciones e integridad referencial en mysql, deberemos crear nuestras tablas con el type=innoDB.

4 comentarios:

Alfonso dijo...

Hola, soy nuevo en esto de linux, el tutorial para instalar postgresql me sirvio de maravilla, ¿podría decirme donde puedo encontrar información u otro tutorial para instalar Mysql y sybase para ubuntu 8.04?, gracias!!!

javoaxian dijo...

Hola alfonso, puedes encontrar muchos artículos de instalación de mysql en la red.

En esta página de mysql puedes encontrar como instalarlo. Si tienes problemas con él, yo espero publicar un artículo de cómo instalarlo este fin de semana.

Con realción a sybase no tengo ninguna referencia que te pueda servir, deja investigo a ver si encuentro alguno. Yo lo he instalado, pero versiones anteriores.

Saludos!!!

Alfonso dijo...

¡Excelente blog!, muchas gracias, me ha funcionado para muchas cosas, que siga creciendo este blog!, ¡gracias JavoAxian!

Anónimo dijo...

Hola buen día, una pregunta, si requiero saber cuál fue la acción que realizó la instrucción CompleteTrans(), cómo puedo recuperarla? estoy con la finalidad de poder enviarle al usuario el mensaje correspondiente.

Saludos y Gracias