Está en la página 1de 2

MANEJO TRANSACCIONAL EN ORACLE

Una transaccin es un conjunto de operaciones que se ejecutan en una base de datos, y que son
tratadas como una nica unidad lgica por el SGBD.
Es decir, una transaccin es una o varias sentencias S! que se ejecutan en una base de datos
como una nica operacin, con"irm#ndose o des$aci%ndose en grupo.
&o todas las operaciones S! son transaccionales. Slo son transaccionales las operaciones
correspondientes al DML, es decir, sentencias SELECT, INSERT, UPDATE y DELETE.
'ara con"irmar una transaccin se utili(a la sentencia COMMIT. )uando reali(amos
COMMIT los cambios se escriben en la base de datos.
'ara des$acer una transaccin se utili(a la sentencia ROLLBACK. )uando
reali(amos ROLLBACK se des$acen todas las modi"icaciones reali(adas por la
transaccin en la base de datos, quedando la base de datos en el mismo estado que antes
de iniciarse la transaccin.
Un ejemplo cl#sico de transaccin son las trans"erencias bancarias.
'ara reali(ar una trans"erencia de dinero entre dos cuentas bancarias debemos descontar el dinero
de una cuenta, reali(ar el ingreso en la otra cuenta y grabar las operaciones y movimientos
necesarios, actuali(ar los saldos. Si en alguno de estos puntos se produce un "allo en el sistema
podr*amos $acer descontado el dinero de una de las cuentas y no $aberlo ingresado en la otra.
'or lo tanto, todas estas operaciones deben ser correctas o "allar todas. En estos casos, al
con"irmar la transaccin +),--./0 o al des$acerla +1,!!B2)30 garanti(amos que todos los datos
quedan en un estado consistente.
En una transaccin los datos modi"icados no son visibles por el resto de usuarios $asta que se
con"irme la transaccin.
El siguiente ejemplo muestra una supuesta transaccin bancaria
DECLARE
importe NUMBER;
Referencia: http://www.devjoker.com/contenidos/Tutorial-PLSQL/63/Transacciones-con-
PLSQL.asp
ctaOrigen VARCHAR2(23);
ctaDestino VARCHAR2(23);
BEGIN
importe := 100;
ctaOrigen := '2530 10 2000 1234567890';
ctaDestino := '2532 10 2010 0987654321';
UPDATE !"#$%& SET &%'DO = &%'DO ( importe
WHERE !"#$% = ctaOrigen;
UPDATE !"#$%& SET &%'DO = &%'DO ) importe
WHERE !"#$% = ctaDestino;
INSERT INTO *O+,*,"#$O&
(!"#$%-O.,/"#0 !"#$%-D"&$,#O0,*1O.$"0 2"3%-*O+,*,"#$O)
VALUES
(ctaOrigen0 ctaDestino0 importe4((1)0 &5&D%$");
INSERT INTO *O+,*,"#$O&
(!"#$%-O.,/"#0 !"#$%-D"&$,#O0,*1O.$"0 2"3%-*O+,*,"#$O)
VALUES
(ctaDestino0ctaOrigen0 importe0 &5&D%$");
COMMIT;
EXCEPTION
WHEN OTHERS THEN
67ms-o8tp8t9p8t-:ine('"rror en :a transaccion:';;&<'"..*);
67ms-o8tp8t9p8t-:ine('&e 6es=acen :as mo6i>icaciones);
ROLLBACK;
END;
Si alguna de las tablas a"ectadas por la transaccin tiene triggers, las operaciones que reali(a el
trigger est#n dentro del #mbito de la transaccin, y son con"irmadas o des$ec$as conjuntamente
con la transaccin.
Durante la ejecucin de una transaccin, una segunda transaccin no podr# ver los cambios
reali(ados por la primera transaccin $asta que esta se con"irme.
ORACLE es completamente transaccional. Siempre debemos especi"icar si que queremos
des$acer o con"irmar la transaccin.
2 todo esto, cabe preguntarse, 4por qu% los motores como S! Server e .n"ormi5 utili(an
transacciones e5pl*citas mientras que ,12)!E utili(a transacciones impl*citas6
Esto es debido a que el "uncionamiento de ,12)!E se basa en el versionado de "ilas +ro7
versioning 8 y &, en los bloqueos0, por lo cual, al iniciar una transaccin puede pasar todo el
tiempo que sea necesario, que otras transacciones podr#n reali(ar lecturas correctamente
+accediendo a la versin correcta de cada "ilas0.
Referencia: http://www.devjoker.com/contenidos/Tutorial-PLSQL/63/Transacciones-con-
PLSQL.asp

También podría gustarte