Establecer y Probar los Niveles de Aislamiento (Isolation Levels)
En este paso, aprenderás sobre los niveles de aislamiento de transacciones (transaction isolation levels) en PostgreSQL y cómo establecerlos y probarlos. Los niveles de aislamiento controlan el grado en que las transacciones concurrentes están aisladas entre sí. Los niveles de aislamiento más altos brindan mayor protección contra la corrupción de datos, pero pueden reducir la concurrencia.
Deberías seguir conectado a la base de datos PostgreSQL desde el paso anterior. Si no, conéctate de nuevo usando:
sudo -u postgres psql
Abre dos ventanas de terminal separadas. En cada terminal, conéctate a la base de datos PostgreSQL como el usuario postgres
. Deberías tener dos prompts postgres=#
.
Terminal 1:
sudo -u postgres psql
Terminal 2:
sudo -u postgres psql
En la Terminal 1, establece el nivel de aislamiento a READ COMMITTED
(aunque este es el valor predeterminado, lo estableceremos explícitamente para la demostración).
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Luego, comienza una transacción.
BEGIN;
En la Terminal 1, lee el saldo de Alice.
SELECT balance FROM accounts WHERE name = 'Alice';
Toma nota del saldo. Ahora, en la Terminal 2, comienza una transacción y actualiza el saldo de Alice.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
UPDATE accounts SET balance = 90.00 WHERE name = 'Alice';
COMMIT;
En la Terminal 1, lee el saldo de Alice nuevamente.
SELECT balance FROM accounts WHERE name = 'Alice';
Debido a que el nivel de aislamiento es READ COMMITTED
, verás el saldo actualizado (90.00) confirmado (committed) por la Terminal 2.
Ahora, probemos el nivel de aislamiento REPEATABLE READ
. En la Terminal 1, revierte (roll back) la transacción actual y establece el nivel de aislamiento a REPEATABLE READ
.
ROLLBACK;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
En la Terminal 1, lee el saldo de Alice nuevamente.
SELECT balance FROM accounts WHERE name = 'Alice';
Toma nota del saldo. Ahora, en la Terminal 2, comienza una transacción y actualiza el saldo de Alice nuevamente.
BEGIN;
UPDATE accounts SET balance = 100.00 WHERE name = 'Alice';
COMMIT;
En la Terminal 1, lee el saldo de Alice nuevamente.
SELECT balance FROM accounts WHERE name = 'Alice';
Debido a que el nivel de aislamiento es REPEATABLE READ
, aún verás el saldo original de cuando comenzó la transacción, incluso si la Terminal 2 ha confirmado (committed) un nuevo valor.
Finalmente, en la Terminal 1, confirma (commit) la transacción.
COMMIT;
Ahora, si lees el saldo de Alice en la Terminal 1 nuevamente, verás el último valor confirmado (committed) (100.00).
Sal de ambas shells psql
.
\q