Acerca de las Transacciones y Sentencias DML
Las sentencias de lenguaje de manipulación de datos (DML) agregan, cambian y suprimen datos de tabla de base de datos. Una transacción es una secuencia de la una o más sentencias SQL que Oracle AI Database trata como una unidad: se realizan todas las sentencias o ninguna.
Acerca de las Sentencias de Control de Transacciones
Una transacción es una secuencia de la una o más sentencias SQL que Oracle AI Database trata como una unidad: se realizan todas las sentencias o ninguna. Necesita transacciones para modelar procesos de negocio que necesitan que se realicen varias operaciones como una unidad.
Por ejemplo, cuando un gestor salga de la compañía, se debe insertar una fila en la tabla JOB_HISTORY que muestre cuándo se marchó el gestor y, para cada empleado que dependa de ese gestor, el valor de MANAGER_ID se debe actualizar en la tabla EMPLOYEES. Para modelar este proceso en una aplicación, debe agrupar las sentencias INSERT y UPDATE en una sola transacción.
Las sentencias de control de transacciones básicas son:
-
SAVEPOINT, que marca un punto de guardado en una transacción, punto al que puede realizar rollback posteriormente. Los puntos de grabación son opcionales y una transacción puede tener varios.
-
COMMIT, que finaliza la transacción actual, hace los cambios permanentes, borra sus puntos de guardado y libera sus bloqueos.
-
ROLLBACK, que realiza ROLLBACK (deshace) de toda la transacción actual o sólo los cambios realizados después del punto a guardar especificado.
En el entorno de SQL*Plus, puede introducir una sentencia de control de transacción después de la petición de datos SQL>.
En el entorno de SQL Developer, puede introducir una sentencia de control de transacción en la hoja de trabajo. SQL Developer también tiene iconos Confirmar Cambios y Deshacer cambios, que se explican en "Confirmación de Transacciones" y "Rollback de Transacciones".
Atención:
Si no confirma explícitamente una transacción y el programa termina de manera anormal, la base de datos realiza automáticamente rollback de la última transacción sin confirmar.
Oracle recomienda finalizar explícitamente las transacciones en programas de aplicación, confirmándolas o realizando rollback de las mismas.
Consulte además:
-
Conceptos de Oracle AI Database para obtener más información sobre la gestión de transacciones
-
Oracle AI Database SQL Language Reference para obtener más información sobre las sentencias de control de transacciones
Confirmación de Transacciones
La confirmación de una transacción hace que sus cambios sean permanentes, borra sus puntos de grabación y libera sus bloqueos.
Para confirmar explícitamente una transacción, utilice la sentencia COMMIT o (en el entorno de SQL Developer) el icono Confirmar Cambios.
Nota: Oracle AI Database emite una sentencia COMMIT implícita antes y después de cualquier sentencia DDL (Lenguaje de definición de datos). Para obtener más información sobre las sentencias DDL, consulte "Acerca de Sentencias de Lenguaje de Definiciones de Datos (DDL)".
Antes de confirmar una transacción:
-
Podrá ver los cambios, pero no los podrá ver otros usuarios de la instancia de base de Datos.
-
Los cambios no son finales: puede deshacerlos con una sentencia ROLLBACK.
Después confirmar una transacción:
-
Los cambios estarán visibles para otros usuarios y para sus sentencias que se ejecuten una vez que confirme la transacción.
-
Los cambios son finales: no puede deshacerlos con una sentencia ROLLBACK.
En el ejemplo 3-1 se agrega una fila a la tabla REGIONS (una transacción muy sencilla), se comprueba el resultado y, a continuación, se confirma la transacción.
Ejemplo 3-1 Confirmación de una transacción
Antes de la transacción:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
4 rows selected.
Transacción (adición de una fila a la tabla):
INSERT INTO regions (region_id, region_name) VALUES (5, 'Africa');
Resultado:
1 row created.
Comprobación de que se ha agregado la fila:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
Confirmación de la transacción:
COMMIT;
Resultado:
Commit complete.
Consulte también: Referencia de lenguaje SQL de Oracle AI Database para obtener información sobre la sentencia COMMIT
Rollback de Transacciones
Al hacer rollback de una transacción, se deshacen sus cambios. Puede realizar rollback de toda la transacción actual o sólo hasta un punto de grabación especificado.
Para realizar ROLLBACK de la transacción actual sólo hasta un punto de guardado especificado, debe utilizar la sentencia ROLLBACK con la cláusula TO SAVEPOINT.
Para realizar ROLLBACK de toda la transacción actual, utilice la sentencia ROLLBACK sin la cláusula TO SAVEPOINT o (en el entorno de SQL Developer) el icono ROLLBACK Changes.
Al revertir toda la transacción actual:
-
Se finaliza la transacción
-
Se revierten todos sus cambios
-
Se borran todos sus puntos de grabación
-
Se libera cualquier bloqueo de la transacción
Al realizar rollback de la transacción actual sólo hasta el punto de grabación especificado:
-
No se finaliza la transacción
-
Se revierten sólo los cambios realizados después del punto de grabación especificado
-
Se borran sólo los puntos de grabación definidos después del punto de grabación especificado (excepto el punto de grabación especificado en sí)
-
Se liberan todos los bloqueos de tabla y de fila adquiridos después del punto de grabación especificado
Las demás transacciones que han solicitado acceso a las filas bloqueadas después del punto de grabación especificado deben seguir esperando hasta que la transacción se confirme o se realice rollback de la misma. Las demás transacciones que no han solicitado las filas pueden solicitar y acceder a las filas inmediatamente.
Para ver el efecto de un rollback en SQL Developer, puede que tenga que hacer clic En el icono Refrescar.
Como resultado del Ejemplo 3-1, la tabla REGIONS tiene una región denominada 'Oriente Medio y África' y una región denominada 'África'. El ejemplo 3-2 corrige este problema (una transacción muy sencilla) y comprueba el cambio, pero, a continuación, realiza un rollback de la transacción y comprueba el rollback.
Ejemplo 3-2 Rollback de Toda una Transacción
Antes de la transacción:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
Transacción (cambio de la tabla):
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
Resultado:
1 row updated.
Comprobación del cambio:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
Rollback de la transacción:
ROLLBACK;
Resultado:
Rollback complete.
Comprobación del rollback:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
Consulte también: Referencia de lenguaje SQL de Oracle AI Database para obtener información sobre la sentencia ROLLBACK
Definición de Puntos de Grabación en Transacciones
La sentencia SAVEPOINT marca un punto de edición en una transacción, punto al que puede realizar rollback posteriormente. Los puntos de grabación son opcionales y una transacción puede tener varios. El Ejemplo 3-3 realiza una transacción que incluye varias sentencias DML y varios puntos de guardado y, a continuación, realiza rollback de la transacción hasta un punto de guardado, deshaciendo sólo los cambios realizados después del punto de guardado.
Ejemplo 3-3 Rollback de una Transacción hasta un punto de grabación
Comprobar la tabla REGIONS antes de transacción:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
Comprobación de los países de la región 4 antes de la transacción:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
Resultado:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Nigeria NG 4
Zambia ZM 4
Zimbabwe ZW 4
6 rows selected.
Comprobación de los países de la región 5 antes de la transacción:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
Resultado:
no rows selected
Transacción, con varios puntos de grabación:
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZM';
SAVEPOINT zambia;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'NG';
SAVEPOINT nigeria;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZW';
SAVEPOINT zimbabwe;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'EG';
SAVEPOINT egypt;
Comprobación de tabla REGIONS después de transacción:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
Comprobación de los países de la región 4 después de la transacción:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
Resultado:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Israel IL 4
Kuwait KW 4
2 rows selected.
Comprobación de los países de la región 5 después de la transacción:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
Resultado:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 5
Nigeria NG 5
Zambia ZM 5
Zimbabwe ZW 5
4 rows selected.
ROLLBACK TO SAVEPOINT nigeria;
Comprobación de la tabla REGIONS después de realizar rollback:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
Resultado:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
Comprobación de los países de la región 4 después de realizar rollback:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
Resultado:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Zimbabwe ZW 4
4 rows selected.
Comprobación de los países de la región 5 después de realizar rollback:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
Resultado:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Nigeria NG 5
Zambia ZM 5
2 rows selected.
Consulte también: Referencia de lenguaje SQL de Oracle AI Database para obtener información sobre la sentencia SAVEPOINT