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 o más sentencias DML que en conjunto constituyen un cambio atómica a la base de datos
  • Una declaración DML
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
  • SYS_CONTEXT devuelve el valor del parámetro asociado con el espacio de nombres de la instante actual. Se puede utilizar esta función en SQL y PL/SQL.SYS_CONTEXT debe ejecutarse localmente.
  • Dual es una tabla, creada durante la instalación, con una sola columna llamada DUMMY y una sola fila de contenido 'X'. El propietario es SYS y puede ser accedida por cualquier usuario.
  • V$TRANSACTION vista de transacciones declaradas por Oracle
  • v$session vista de sesión declaradas por Oracle
Sesión 1Sesión 2
CONNECT epacheco/bingoCONNECT 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

  • Una transacción termina cuando se produce alguna de las siguientes acciones:
    Un usuario emite una sentencia COMMIT -guardar- o ROLLBACK -deshacer- sin una cláusula SAVEPOINT -punto de restauración.
  • Mediante COMMIT, un usuario solicita explícitamente o implícitamente que los cambios en la transacción sean permanentes. Los cambios realizados por la transacción son permanentes y visibles para otros usuarios sólo después de una transacción. La transacción se muestra en la Tabla 4.5.1 termina despupes del COMMIT
  • Un usuario ejecuta una sentencia DDL como CREATEDROPRENAMEZ o ALTER.
    La base de datos emite una sentencia COMMIT implícito antes y después de cada instrucción DDL. Si la transacción actual contiene instrucciones DML, a continuación, Oracle Database primera confirma la transacción y luego corre y se compromete la sentencia DDL como una nueva, transacción de un único estado.
  • Un usuario sale normalmente de la mayoría de las utilidades y herramientas de base de datos Oracle, haciendo que la transacción actual que se ha comprometido de forma implícita. El comportamiento AUTOCOMMIT cuando un usuario se desconecta depende de la aplicación y la configuración del gestor
  • .

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
FechaPara solventar obligaciones
11/07/1618.8607
12/07/1618.5991
13/07/1618.4597
14/07/1618.3006
15/07/1618.3937
16/07/1618.3061
Información diaria
FechaPara solventar obligaciones
17/07/1618.3061
18/07/1618.3061
19/07/1618.4920
20/07/1618.4879
21/07/1618.5719
22/07/1618.5729

READ

Sesión 1Sesió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 1Sesió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 1Sesió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;
 

Comentarios