viernes, 26 de septiembre de 2008

Transacciones y bloqueo de Tablas MySQL

Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la actualización en disco.

Esta modalidad de autocommit solo puede ser desactivada si se esta trabajando con tablas InnoDB (Que además son las únicas que soportan la integridad referencial en Mysql).

Para desactivar momentáneamente el autocomit ejecutamos el comando:

SET AUTOCOMMIT=0;

Luego de deshabilitar el autocommit (set autocommit = 0;) obligadamente tendremos que utilizar
obligadamente COMMIT para guardar o ROLLBACK para deshacer.

Si quiere deshabilitar el modo autocommit para una serie única de comandos, puede usar el comando
START TRANSACTION


Ejemplo:

Creare una nueva tabla en la Base de datos Empresa
:

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

)ENGINE=InnoDB

y Ahora insertare registros de la tabla departamentos a departamentos2 mediante una transacción


START TRANSACTION;
SELECT @A := presupuesto
FROM departamentos
WHERE codigodep =11;
INSERT INTO departamentos2( codigodep, nombredep, presupuesto )
VALUES ( 11, 'prueba', @A );
COMMIT;

En el ejemplo anterior guarde el presupuesto del departamento 11 en la variable @A y luego asigne ese presupuesto en la tabla departamentos2

Ahora un ejemplo donde replicare todos los datos de un departamento en la tabla departamentos2

START TRANSACTION;
SELECT @A := presupuesto, @B := codigodep, @C := nombredep
FROM departamentos
WHERE codigodep =33;
INSERT INTO departamentos2( codigodep, nombredep, presupuesto )
VALUES (
@B , @C , @A
);
COMMIT ;


En el ejemplo anterior se copio todo un departamento al la tabla departamentos 2....

Se puede sumar los presupuestos y asignarlos así:

START TRANSACTION;
SELECT @A:=PRESUPUESTO FROM departamentos WHERE codigodep=11;
UPDATE departamentos2 SET PRESUPUESTO = PRESUPUESTO + @A WHERE codigodep=33;
COMMIT;


En este último ejemplo actualizo el presupuesto del departamento 33 de la tabla
departamentos2 sumandole todo el presupuesto de la departamento 11 de la tabla
departamentos

Al realizar una transacción SQL se debe tener en cuenta que la tabla se bloquea
quedando solo habilitada a lo que estamos realizando nosotros


No hay comentarios: