4.5. COMMIT Y ROLLBACK

Estructura de una transacción

Una transacción de base de datos consta de una o más instrucciones. Específicamente, una transacción consiste en una de las siguientes:

Una transacción tiene un principio y un final.

Inicio de una transacción

Una transacción comienza cuando se encuentra la primera sentencia de SQL ejecutable.

Una sentencia de SQL ejecutable es una instrucción SQL que genera llamadas a una instancia de base de datos, incluyendo DML y DDL y la instrucción SET TRANSACCIÓN.

Cuando se inicia una transacción, Oracle Database le asigna un segmento undo de datos para grabar las entradas Rollback para la nueva transacción. Un id de transacción se asigna durante la primera instrucción DML.

Un ID de transacción es único y representa el número de segmento de deshacer y número de secuencia.

El siguiente ejemplo se ejecuta una instrucción UPDATE para iniciar una transacción, Verificamos su comportamiento consultando la vista V$transacción,

Ejemplo básico en Oracle precio del dólar con respecto al peso.

Iniciamos dos consolas Oracle

Sesión 1 Sesión 2
CONNECT epacheco/bingo CONNECT epacheco/bingo AS SYSDBA
UPDATE dolar SET precio = precio;
Transacciones pendientes
SELECT XID AS "txn id", XIDUSN AS "undo seg", XIDSLOT AS "slot", XIDSQN AS "seq",
STATUS AS "txn status", addr
FROM V$TRANSACTION;
SELECT sid FROM v$session
WHERE taddr = 'BDB0F06C';
SELECT COUNT(*) n FROM V$TRANSACTION;
COMMIT

Final de una transacción

SET TRANSACTION

Utilice la instrucción SET TRANSACTION para establecer la transacción actual como de sólo lectura o de lectura/escritura, establecer su nivel de aislamiento, asignarle un segmento de rollback, o asignar un nombre a la transacción.

La sintaxis Oracle es la siguiente

Considere la siguiente información

Información diaria
Fecha Para solventar obligaciones
11/07/16 18.8607
12/07/16 18.5991
13/07/16 18.4597
14/07/16 18.3006
15/07/16 18.3937
16/07/16 18.3061
Información diaria
Fecha Para solventar obligaciones
17/07/16 18.3061
18/07/16 18.3061
19/07/16 18.4920
20/07/16 18.4879
21/07/16 18.5719
22/07/16 18.5729

READ

Sesión 1 Sesión 2
CONNECT epacheco/bingo;
SET TRANSACTION READ ONLY;
CONNECT epacheco/bingo;
INSERT INTO dolar VALUES ('17/07/16',18.3061);
INSERT INTO dolar VALUES ('18/07/16',18.3061);

COMMIT;

COMMIT

READ/WRITE

Sesión 1 Sesión 2
CONNECT epacheco/bingo;
SET TRANSACTION READ WRITE;
CONNECT epacheco/bingo;
SET TRANSACTION READ WRITE;
INSERT INTO dolar VALUES ('11/07/16',18.8607);
INSERT INTO dolar VALUES ('12/07/16',18.5991);
INSERT INTO dolar VALUES ('13/07/16',18.4597);
INSERT INTO dolar VALUES ('19/07/16',18.4920);
INSERT INTO dolar VALUES ('20/07/16',18.5719);

SERIALIZABLE

Una transacción SERIALIZABLE opera en un ambiente que hace que parezca como si no existieran otros usuarios que modifican los datos en la base de datos. Cualquier fila se lee está asegurada al ser el mismo en una de nueva lectura, y cualquier consulta se ejecuta está garantizado para devolver los mismos resultados para la vida de una transacción.

CREATE TABLE a ( x INT );
CREATE TABLE b ( x INT );
Sesión 1 Sesión 2
CONNECT epacheco/bingo;
CREATE TABLE a ( x INT );
CREATE TABLE b ( x INT );
ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE; CONNECT epacheco/bingo;
INSERT INTO a SELECT COUNT(*) FROM b; ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE;
INSERT INTO b SELECT COUNT(*) FROM a;
INSERT INTO b SELECT COUNT(*) FROM a;
... INSERT INTO b SELECT COUNT(*) FROM a;
COMMIT; COMMIT;
 

Observe que no importa cuantas veces inserte en la sesión 2, el resultado sera el mismo.

Video

Fuente: VDATASYSTEM

Transacciones Oracle