PostgreSQL - TRANSACCIONES

Una transacción es una unidad de trabajo que se realiza en una base de datos. Las transacciones son unidades o secuencias de trabajo realizadas en un orden lógico, ya sea de forma manual por un usuario o automáticamente por algún tipo de programa de base de datos.

Una transacción es la propagación de uno o más cambios en la base de datos. Por ejemplo, si está creando un registro, actualizando un registro o eliminando un registro de la tabla, entonces está realizando una transacción en la tabla. Es importante controlar las transacciones para garantizar la integridad de los datos y manejar los errores de la base de datos.

Prácticamente, agrupará muchas consultas de PostgreSQL en un grupo y las ejecutará todas juntas como parte de una transacción.

Propiedades de las transacciones

Las transacciones tienen las siguientes cuatro propiedades estándar, generalmente denominadas por el acrónimo ACID:

  • Atomicity- Asegura que todas las operaciones dentro de la unidad de trabajo se completen con éxito; de lo contrario, la transacción se aborta en el punto de falla y las operaciones anteriores se revierten a su estado anterior.

  • Consistency - Garantiza que la base de datos cambie correctamente de estado tras una transacción confirmada con éxito.

  • Isolation - Permite que las transacciones funcionen de forma independiente y transparente entre sí.

  • Durability - Asegura que el resultado o efecto de una transacción comprometida persista en caso de falla del sistema.

Control de transacciones

Los siguientes comandos se utilizan para controlar las transacciones:

  • BEGIN TRANSACTION - Para iniciar una transacción.

  • COMMIT - Para guardar los cambios, alternativamente puede usar END TRANSACTION mando.

  • ROLLBACK - Revertir los cambios.

Los comandos de control transaccional solo se usan con los comandos DML INSERT, UPDATE y DELETE solamente. No se pueden usar al crear tablas o descartarlas porque estas operaciones se confirman automáticamente en la base de datos.

El comando BEGIN TRANSACTION

Las transacciones se pueden iniciar usando BEGIN TRANSACTION o simplemente el comando BEGIN. Estas transacciones generalmente persisten hasta que se encuentra el siguiente comando COMMIT o ROLLBACK. Pero una transacción también se ROLLBACK si la base de datos está cerrada o si ocurre un error.

La siguiente es la sintaxis simple para iniciar una transacción:

BEGIN;

or

BEGIN TRANSACTION;

El comando COMMIT

El comando COMMIT es el comando transaccional que se utiliza para guardar los cambios invocados por una transacción en la base de datos.

El comando COMMIT guarda todas las transacciones en la base de datos desde el último comando COMMIT o ROLLBACK.

La sintaxis del comando COMMIT es la siguiente:

COMMIT;

or

END TRANSACTION;

El comando ROLLBACK

El comando ROLLBACK es el comando transaccional que se utiliza para deshacer transacciones que aún no se han guardado en la base de datos.

El comando ROLLBACK solo se puede utilizar para deshacer transacciones desde que se emitió el último comando COMMIT o ROLLBACK.

La sintaxis del comando ROLLBACK es la siguiente:

ROLLBACK;

Ejemplo

Considere que la tabla EMPRESA tiene los siguientes registros:

id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

Ahora, iniciemos una transacción y eliminemos registros de la tabla que tengan edad = 25 y finalmente usamos el comando ROLLBACK para deshacer todos los cambios.

testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

Si verifica la tabla EMPRESA todavía tiene los siguientes registros:

id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

Ahora, comencemos otra transacción y eliminemos registros de la tabla que tengan edad = 25 y finalmente usamos el comando COMMIT para confirmar todos los cambios.

testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

Si comprueba la tabla EMPRESA, todavía tiene los siguientes registros:

id | name  | age | address    | salary
----+-------+-----+------------+--------
  1 | Paul  |  32 | California |  20000
  3 | Teddy |  23 | Norway     |  20000
  5 | David |  27 | Texas      |  85000
  6 | Kim   |  22 | South-Hall |  45000
  7 | James |  24 | Houston    |  10000
(5 rows)