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:
$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().
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.
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.






