You are on page 1of 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

Referencia4 $ttp455666.devjo7er.com5contenidos5/utorial8'!S !59:5/ransacciones8 con8'!S !.asp;

DECLARE importe NUMBER; 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 comple amen e ransaccional. Siempre debemos especi"icar si que queremos des$acer o con"irmar la transaccin. 2 todo esto, cabe preguntarse, <por qu% los motores como S ! Server e .n"ormi; utili(an transacciones e;pl*citas mientras que ,12)!E utili(a transacciones impl*citas= Esto es debido a que el "uncionamiento de ,12)!E se basa en el versionado de "ilas +ro6 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.

Referencia4 $ttp455666.devjo7er.com5contenidos5/utorial8'!S !59:5/ransacciones8 con8'!S !.asp;

You might also like