sábado, 27 de septiembre de 2008

¿Que son las transacciones SQL ?

Son un conjunto de instrucciones SQL que tienen la cualidad de ejecutarse como una sola unidad, es decir o se ejecutan todas o no se ejecuta ninguna.

A las tablas capaces de soportar transacciones se les conoce como ACID (Atomicidad, Consistencia, Aislamiento , Durabilidad) en inglés (Atomicity, Consistency, Isolation & Durability)

  1. Atomicidad :=> Algo que no puede dividirse, osea todas las consultas son tratadas como una sola y estas solo se ejecutan cuando todas son correctas en el caso de existir un error no se ejecuta nada.

  2. Consistencia :=> Esto esta ligado a la integridad referencial, es decir solo se pueden escribir datos validos respetando los tipos de datos declarados y la integridad referencial.

  3. Aislamiento :=> Cada transacción es ejecutada independientemente de otra transacción o mejor dicho una tras otra, luego de que estas transacciones son ejecutadas (exitosas o incorrectas) los cambios son visibles para el resto de los usuarios.

  4. Durabilidad :=> Cuando se completa una transacción con éxito los cambios se vuelven permanentes.

Ejemplo

Veamos con el siguiente ejemplo cuan importante puede ser una transacción.

Supongamos que dos vendedores de una tienda consultan las disponibilidad de televisores LCD y solo hay uno es stock (como estos están de moda) para realizar una venta y solo queda un televisor en Stock.

Primero solo con SQL

Vendedor 1 : SELECT stock FROM televisores;

Vendedor 2 : SELECT stock FROM televisores;

Vendedor 1 : UPDATE televisores SET stock = stock -1;

Vendedor 2 : UPDATE televisores SET stock = stock -1;

Primero al hacer los SELECT cada vendedor vera en su pantalla que hay disponible 1 televisor.

El vendedor 1 venderá el televisor dejando el stock en 0, luego el vendedor 2 que no sabe que el televisor ya ha sido vendido venderá el televisor (pensando que hay stock) y el stock sera -1 ya que el último ha sido vendido por el vendedor 1.

Si fuese la vida real habrá un cliente que deberá esperar mas de lo normal para que llegue su televisor.


Ahora los mismo con Transacciones

Vendedor 1 : START TRANSACTION;

Vendedor 1 : SELECT stock FROM televisores;

Vendedor 1 : UPDATE televisores SET stock = stock -1;

Vendedor 1 : COMMIT; (ejecuta)


Vendedor 2 : START TRANSACTION;

Vendedor 2 : SELECT stock FROM televisores;

Vendedor 2 : ROLLBACK; (sale de la transacción sin hacer nada mas)

Vendedor 2 : Avisa a cliente que no hay disponibilidad y pregunta si quiere comprarlo y esperar unos días hasta que nuevamente exista stock.


Como hemos visto las operaciones se hicieron ordenadamente permitiendo la consistencia de los datos una vez que el primer vendedor termino la operación el vendedor 2 realizo sus consultas.


Ejemplo 2 (Algo Mas trabajado)

Este ejemplo muestra como realizar operaciones en una transacción tenemos 1 una tabla llamada departamentos con la siguiente estructura y registros


CREATE TABLE `departamentos` (
`CODIGODEP` INTEGER(11) NOT NULL DEFAULT '0',
`NOMBREDEP` VARCHAR(100) ,
`PRESUPUESTO` INTEGER(11) ,
PRIMARY KEY (`CODIGODEP`)
)ENGINE=InnoDB

INSERT INTO `departamentos` (`CODIGODEP`, `NOMBREDEP`, `PRESUPUESTO`) VALUES
(1, 'Informatica', 300000),
(2, 'Personal', 200000),
(11, 'Calidad', 150000),
(13, 'Seguridad', 450000),
(56, 'Recursos Humanos', 900000),
(77, 'Administracion', 1500000);

y ahora crearemos una nueva tabla departamentos2 y asignaremos el 30% del dinero del presupuesto de cada departamento a la tabla departamentos2 , es decir en presupuesto de departamentos restaremos el 30% de su presupuesto y los asignaremos a los departamentos de de la tabla departamentos2. (las estructuras serán iguales e incuso mantendremos los mismos códigos de y nombres de los departamentos)


CREATE TABLE `departamentos2` (
`CODIGODEP` INTEGER(11) NOT NULL DEFAULT '0',
`NOMBREDEP` VARCHAR(100) ,
`PRESUPUESTO` INTEGER(11) ,
PRIMARY KEY (`CODIGODEP`)
)ENGINE=InnoDB

y ahora las transacciones


START TRANSACTION;
insert into `departamentos2`
select codigodep, nombredep, presupuesto * 0.30 from `departamentos`;
update departamentos set presupuesto = presupuesto - (presupuesto * 0.30);
COMMIT;


El resultado ha sido una tabla de posee todos los registros de departamentos 1 y los presupuestos de ambas tablas han sido modificados correctamente sumando y restando respectivamente un 30%.


Con esto evitamos que algún otro usuario este modificando la tabla departamentos cuando realizamos la operación

Jlara

2 comentarios:

Anónimo dijo...

ACID (Atomicity, Consistency, Isolation & Durability)

Isolation = Aislamiento en español

Saludos, :-)

Jorge Lara Cravero dijo...

Muchas Grácias