Hosting Software News & Commentary Hosting Software News & Commentary Hosting Software News & Commentary

Durante mucho tiempo he estado trabajando con Oracle Developer en versiones como la 6i o la 9g. Por costumbre, cuando generaba código PL/SQL y realizaba algún tipo de transacción tipo Insert , Delete o Update, siempre tenía encuenta al finalizar la transacción el poner el commit cuando la transacción se realizaba con éxito y el rollback cuando saltaba alguna excepción controlada.

Desarrollando páginas web en PHP y MySql me he encontrado que MySql tiene autocommit activado, lo que conlleva que en el caso que la transacción no se realice con éxito puede provocar una inconsistencia de datos.

Para que lo entendamos vamos a poner un ejemplo muy simple:

Imaginemos que queremos insertar en una tabla clientes un importe de una factura, así intentamos actualizar el importe de sus facturas con la siguiente sentencia:

//en una parte de código updatamos el saldo del cliente

$sql = “update clientes set saldo = 1000 where cliente = ‘150′”;
mysql_query($sql) or die (mysql_error());

//en otra parte de nuestro programa volvemos a updatar el saldo del cliente.

$sql2= “update clientes set saldo = 1500 where cliente = ‘150′”;
mysql_query($sql2) or die (mysql_error());

?>

En este caso si el primer update funcionara, mysql haría el commit automático y nos actualizaria el saldo del cliente 150. Si la segunda transacción fallara, mysql nos avisaría del error pero al hacer el commit anterior el saldo del cliente se quedaría con la primera alcualización , con lo que su saldo sería 1000. Si este código estuviera incluido en un programa que validara saldos de nuestros clientes probablemente en algunos casos nos daría inconsistencia de datos, ya que nos ofrecería información mal actualizara.

Para intentar solventar estos problemas, MySql nos ofrece la posibilidad de crear tablas en modo InnoDB que nos permitirá bloquear registros, tablas, y realizar los commit´s o rollback´s manuales.

A continuación vemos un ejemplo de creación de tabla en modo InnoDB:

CREATE TABLE prueba(
id int not null auto_increment,
cliente char(100)
primary key(id)
)ENGINE = InnoDB;

?>

  1. No user reviews yet.


Leave a Reply





Blogroll