Professional Documents
Culture Documents
Transacciones
En Oracle:
Una transaccin es una unidad de trabajo atomica que contiene una o ms sentencias SQL Los efectos de las transacciones pueden ser confirmados (aplicados a la BD) o retrocedidos (deshechos de la BD). Una transaccin siempre comienza con la primera sentencia SQL, no existe el comando BEGIN. Una transaccin cuando una transaccin termina siempre es confirmada o retrocedida, ya se explcitamente a travs de los comando COMIIT o ROLLBACK o implcitamente al ocurrir una sentencia DDL.
Sentencias Utilizadas
Contiene la sintaxis de las sentencias del lenguaje de definicin de datos (Data Definition Language o DDL) como CREATE TABLE, CREATE INDEX, CONSTRAINTS, DATATYPES, etc. Las sentencias del lenguaje de manipulacin de datos (Data Manipulation Language o DML) como SELECT, UPDATE, INSERT, DELETE, COMMIT, ROLLBACK, etc. El uso de funciones estndar como TO_CHAR, TO_DATE, TO_NUMBER, DECODE, MONTHS_BET WEEN,INSTR, etc...
Ejemplo
LA TRANSACCION COMIENZA AQUI
UPDATE savings_accounts SET balance = balance - 500 WHERE account = 3209; UPDATE checking_accounts SET balance = balance + 500 WHERE account =3208; INSERT INTO journal VALUES (journal_seq.NEXTVAL, '1B' 3209, 3208, 500); COMMIT WORK;
SENTENCIAS DE LA TRANSACCIN
SELECT UPDATE
Que una sentencia se ejecute correctamente no implica que la transaccin a la que pertenece sea confirmada. Todas las sentencias de una transaccin pueden correr correctamente, pero sus efectos pueden ser desechos hasta que la transaccin sea confirmada. La confirmacin indica que los cambios realizados durante una transaccin son hechos permanentes. En Oracle, las transacciones se confirman cuando:
Se invoca explcitamente a la sentencia COMMIT. Automticamente (implcitamente), cuando se produce una sentencia DDL o cuando se termina la sesin con la BD.
Lo que se persigue con el uso de transacciones es por un lado contar con una transparencia adecuada de las acciones concurrentes a una base de datos y por el otro tener una transparencia adecuada en el manejo de las fallas que se pueden presentar en una base de datos.
El retroceso a nivel de sentencia (statement level rollback) ocurre cuando se produce un error al ejecutar una sentencia. Su efecto es como si la sentencia nunca hubiera ocurrido. Ejemplos son:
Insercin de una clave primaria duplicada Insercin del valor nulo en un campo no nulo. Cuando existe un deadlock, se retrocede una de las sentencias involucradas.
Errores descubiertos en la etapa de parsing de la sentencia no implica un retroceso a nivel de sentencia. El retroceso de una sentencia solo implica la perdida del trabajo realizado por la misma. Si una sentencia DDL es retrocedida el COMMIT implcito no es desecho.
Confirmacin de Transacciones
Cuando una transaccin se confirma, los cambios provocados por ellas se hacen permanentes. Antes de la confirmacin ocurre los siguiente:
Oracle ha generado informacin para deshacer la transaccin. Oracle ha generado informacin para rehacer la transaccin. Los cambios han sido aplicados a los buffers del SGA. La transaccion se marca como finalizada y su System Change Number (SCN) es aplicado a los registros de la tabla. El Log Writter Process (LGWR) escribe las entradas redo log del SGA y SCN de la transaccin. Este evento atmico constituye la confirmacin de la transaccin. Los bloqueos de la transaccin son liberados. La transaccin se marca como completa.
SENTENCIAS
Las sentencias de finalizacin de transaccin son: COMMIT: la transaccin termina correctamente, se vuelcan los datos al tablespace original y se vaca el RBS. ROLLBACK: se rechaza la transaccin y el vaca el RBS. Cualquier cambio realizado desde que se inici la transaccin se deshace, quedando la base de datos en el mismo estado que antes de iniciarse la transaccin.
Ejemplo de commit
INSERT INTO pais VALUES(PY, PARAGUAY); UPDATE persona SET pais = PY WHERE id = 1; COMMIT;
Cuando se ejecuta la sentencia COMMIT los cambios realizados en la base de datos son hechos permanentes.
Retroceso de Transacciones
Retroceder (Rollback) significa deshacer todos los cambios hechos por las sentencias de una transaccin sin confirmar: Para ello Oracle hace uso del los undo tablespaces para almacenar los valores antiguos. Los tipos de retrocesos pueden ser:
Statement Level Rollback Retroceso hasta un punto de recuperacin (save point) Retroceso por pedido del usuario Retroceso debido a una terminacin anormal Retroceso de todas las transacciones por terminacin anormal del sistema Retroceso de transacciones incompletas en la etapa de recuperacin del sistema. Oracle deshace todos los cambios realizados utilizando los datos del undo tablespace Oracle libera los bloqueos que mantena la transaccin. Oracle finaliza la transaccin.
Ejemplo de Rollback
INSERT INTO pais VALUES(1, PY, PARAGUAY); UPDATE persona SET pais = PY WHERE id = 1; ROLLBACK;
Tanto los resultados de la sentencias INSERT y UPDATE son deshechos cuando se invoca a la sentencia ROLLBACK;
Es posible declarar puntos intermedios en una transaccin que permiten guardar el trabajo realizado hasta el mismo y a partir de los cuales es posible continuar cuando ocurre un fallo. Dentro de una transaccin se pueden crear los llamados punto de control mediante la sentencia:
SAVEPOINT Nombre_punto_control;
Para retroceder una transaccin hasta un punto de control se utiliza la sentencia ROLLBACK TO SAVEPOINT <nombre> Cuando una transaccin es retrocedida:
Oracle solo deshace las sentencias realizadas luego del punto de control. Oracle preserva el savepoint correspondiente y los savepoints anteriores a este. Oracle libera los bloqueos obtenidos luego del savepoint y preserva los obtenidos antes del mismo.
Caractersticas
Consistencia: Una transaccin es un programa correcto que lleva la base de datos de un estado consistente a otro con la misma caracterstica. Gracias a esto, las transacciones no violan las reglas de integridad de una base de datos. Aislamiento: Una transaccin en ejecucin no puede revelar sus resultados a otras transacciones concurrentes antes de su commit. Ms an, si varias transacciones se ejecutan concurrentemente, los resultados deben ser los mismos que si ellas se hubieran ejecutado de manera secuencial (seriabilidad).La seriabilidad consiste en asegurarse que los cambios siguen un orden adecuado.
Atomicidad: Una transaccin es tratada como una unidad de operacin. Por lo tanto todas las acciones de la transaccin se llevan a cabo o ninguna de ellas se realiza.La atomicidad requiere que si una transaccin se interrumpe por una falla, sus resultados parciales deben ser deshechos. Se efectan todas las transacciones, pero en caso de fallas no se realiza ninguna. Una transaccin debe concluir comprometida o abortada. Durabilidad: Es la propiedad de las transacciones que asegura que una vez que una transaccin realiza su commit, sus resultados son permanentes y no pueden ser borrados de la base de datos, se asegura que los resultados de una transaccin sobrevivirn a fallas del sistema
Transacciones Serializables
Oracle solo permite que las transacciones serializables realicen cambios solo si se puede comprobar que estos sean consistentes con un planificacin secuencial. Cuando una transaccin serializable intenta modificar una fila ya modificada por otra transaccin posterior confirmada Oracle genera un error:
ORA-08177: Cannot serialize access for this transaction La sentencia es entonces retrocedida pero la transaccin no. Confirmar la transaccin para guardar el trabajo hecho. Ejecutar sentencias correctivas (ROLLBACK TO SAVEPOINT).
Transacciones Serializables
Read Commited
Cuando el sistema debe ser capaz de procesar rpidamente mltiples transacciones. Cuando la posibilidad de que dos transacciones modifiquen los mismos datos sea casi nula. Cuando las transacciones no sean afectadas por lecturas no repetibles y lecturas fantasmas. Cuando la probabilidad de que dos transacciones modifiquen las mismas filas sea baja. Cuando las transacciones son afectadas por lecturas no repetibles y lecturas fantasmas. No apto para transacciones largas, pues pueden ocurrir problemas de secuencialidad.
Serializable
Bloqueos en Oracle
Oracle provee concurrencia e integridad de datos entre transacciones concurrentes a travs de bloqueos. Como los mecanismos de control de concurrencia de Oracle estn ligados a mecanismo de bloqueos, Oracle proporciona y administra automticamente mecanismos del bloqueos En Oracle existen bloqueos implcitos para las sentencias SQL, as los usuarios (casi) no necesitan bloquear explcitamente los datos. Estos mecanismos automticos ocurren al ms bajo nivel del restrictividad (a nivel de filas) garantizndose integridad de datos y alta concurrencia.
Bloqueos en Oracle
Este bloqueo se obtiene al modificar los datos. Solo la transaccin que obtiene este bloqueo puede alterar los datos, otras transacciones quedan bloqueadas.
Permite que mltiples transaccin puedan leer simultneamente los datos pero evita el acceso concurrente de escritores.
Un bloqueo adquirido por una transaccin es mantenido hasta que esta finalice. Los bloqueos adquiridos luego de un SAVEPOINT son liberados cuando la transaccin es retrocedida hasta el mismo.
Deadlocks
Oracle detecta Deadlocks y los resuelve retrocediendo una de las sentencias involucradas, la que pertenece a la transaccin que detecta el deadlock.
Bloqueos explcitos
SQL > LOCK TABLE <tabla> IN <lockmode> MODE [NOWAIT]
MODOS: ROW SHARE (RS)
Permite acceso concurrente a la tabla bloqueada (consultas y actualizaciones en filas no bloqueadas). Impide que otros usuarios bloqueen la tabla completa en modo EXCLUSIVE.
Permite acceso concurrente a la tabla bloqueada (consultas y actualizaciones en filas no bloqueadas). Impide que la tabla se bloquee en modo SHARE, SHARE EXCLUSIVE y EXCLUSIVE. Permite consultas concurrentes Se pausa cualquier intento de modificacin desde otra transaccin Sirve para tener una versin estable, que no puede modificarse, de los datos mientras alguien tenga un bloqueo SHARE. Otras transacciones no pueden bloquear ROW EXCLUSIVE ni EXCLUSIVE.
SHARE (S)
Bloqueos explcitos
EXCLUSIVE (X)
Permite que otras transacciones lean la tabla Slo la transaccin que posee el lock puede modificar la tabla Se impide que otras transacciones bloqueen SHARE Slo una transaccin puede tener SHARE ROW EXCLUSIVE sobre un tabla No permite que se cambie el tipo de bloqueo sobre la tabla. Permite querys sobre la tabla bloqueada Prohibe cualquier otra actividad sobre la tabla (actualizaciones, otros bloqueos, etc.) Slo una transaccin puede tener un bloqueo EXCLUSIVE.
Bloqueos Explcitos
SENTENCIA
SELECT ... FROM table INSERT INTO table UPDATE table ...
Implicito
No Si Si
Si
Si No No No No No
RX
RS RS RX S SRX X
Si
Si No No No No No