Php y Sql: Transacciones con Php y SQL Server

Cuando trabajamos con manipulación de datos, en este caso insert, update o delete, siempre tenemos que verificar que las consultas se han realizado correctamente y que no dejamos el “trabajo a medias”. Es bastante común que cuando realizamos por ejemplo un insert en una tabla, también queramos realizar otra consulta en la misma tabla o en una distinta en paralelo, y hay que asegurarse de que las dos consultas se han realizado correctamente, ya que si una de las dos no se ha realizado no nos interesa que los datos manipulados queden grabados. Para ello se utiliza la transacción, que son un conjunto de órdenes que se ejecutan de manera atómica (inseparable), si una “orden” falla entonces no se realizará ninguna de ellas, si por el contrario todo se ejecuta correctamente los datos serán grabados de manera permanente.

La estructura de una transacción se divide en tres partes: inicio, cuerpo, final. En sql server iniciamos una transacción con “BEGIN TRAN”, en el cuerpo se ejecutan las consultas, y al final se evalúan los resultados  para grabar los datos con “COMMIT”, o restablecer la base de datos tal y como estaba antes de ejecutar la transacción con “ROLLBACK”. Aquí dejo un ejemplo muy visual y simple:

//Iniciamos la transacción en sql server
mssql_query("BEGIN TRAN");

//Ejecutamos la primera consulta guardando el resultado dentro de la variable $consulta
$consulta = mssql_query("INSERT INTO usuarios VALUES('".$email."', '".$nombre."')");

//Ejecutamos la segunda consulta guardando el resultado dentro de la variable $consultaAuditTrail
$consultaAuditTrail = mssql_query("INSERT INTO Audit_trail VALUES(getdate(), '".$email."')");

//Evaluamos si las consultas se han realizado correctamente
if (!$consulta || !$consultaAuditTrail) {
    //Alguna o las dos consultas han fallado, y le indicamos al motor de la base de datos que restablezca la base de datos tal y como estaba antes de iniciar la transacción
    mssql_query("ROLLBACK");
}else {
    //Las dos consultas se han realizado correctamente, y le indicamos al motor de la base de datos que puede grabar los datos     
    mssql_query("COMMIT");
}
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s