Skip to main content

Transacciones

Inicio y final de una transacción

BEGIN o START (Inicio transacción)

TRANSACTION READ ONLY/READ WRITE (Leer únicamente/ Leer y escribir)

ISOLATION LEVEL READ COMMINTTED/SERIALIZABLE(Nivel de aislamiento)

  • SELECT name FROM supermarket WHERE num1 > 600 “FOR UPDATE;”(Bloque de Fila)
  • o UPDATE supermarket SET num1=num1+50;

SAVEPOINT TO sav1; (Podemos guardar las intrucciones)

ROLLBACK; (Reinicia la transacción borrando sus instrucciones)

COMMIT; (Fin)

Qué es una transacción?

Una transacción consta de unos valores fundamentales llamados leyes ACID. (Atomic Consistent Isolated Durable)

  • Atomic. Porque sus valores son indivisibles y están en un estado consistente.
  • Consistent. Cuando se finaliza una transacción todas las reglas y su consistencia son respetadas.
  • Isolated. Todas las transacciones son individuales, uno no tiene porque afectar a la otra.
  • Durable. La seguridad de que los datos permanecen en el tiempo.

WAL

Que sucede cuando tenemos un falló de sistema y una transacción no ha sido finalizada. WAL.

Podemos utilizar WAL (Writte Anticipe Lock). Sistema que guarda en un archivo las operaciones realizadas antes de realizar un COMMIT, si en algún caso, como por ejemplo, si nos apagase el sistema antes de realizar un COMMIT podríamos leer el registro de WAL y completar la operación.

Fenómenos no deseados para obtener el mejor aislamiento. (ACiD) Isolation.

  • Dirty Read (Lectura Bruta). Obtenemos una lectura bruta cuando una transacción consigue leer datos escritos o modificados por una transacción concurrente y no confirmada.
  • Norepeatable read (Lectura no repetida). Tenemos una lectura repetida cuando en una transacción se realiza dos veces la lectura de los mismos datos y obtiene resultados diferentes debidos a otra transacción concurrente confirmada.
  • Phathom read (Lectura fantasma). Cuando tenemos los resultados de un lectura no repetida, pero la consulta contiene una condición. (WHERE).N

Nivel de aislamiento

Cuando comenzamos una transacción, después de BEGIN, colocamos TRANSACTION y el tipo de transacción.

  • READ ONLY
  • READ WRITE

Después hemos de añadir con tal de obtener el nivel  que consideremos oportuno con ISOLATION LEVEL y el tipo:

  • READ COMMITED. Cuando una transacción solo puede ver los cambios confirmados antes de que esta comienza. No permite la lectura bruta, pero si la lectura norepetida y la lectura fantasma.
  • SERIALIZABLE. Cuando todas las instrucciones de la transacción en curso pueden acceder a las datos. No permite ninguno de los fenómenos no deseados.

Bloques de Fila

FOR UPDATE

Con esta forma de bloqueo conseguimos bloquear los registros selecciondos.

SELECT * FROM empleados FOR UPDATE; Los registros seleccionados están bloquedos.

Bloqueo a nivel de tabla

Bloqueamos una tabla y cortamos el efecto de concurrencia.

LOCK TABLE personal ACCESS EXCLUSIVE MODE

Por Ejemplo:

READ COMMITED

Tenemos una transacción por un lado declarada con READ ONLY y READ COMMITED; y otra por otro lado que READ/WRITE y READ COMMITED;

La primera solo podrá hacer select, mientras que la segunda aparte de leer, podrá modificar o introducir datos. Si entre lectura y lectura de la primera transacción, en la segunda hay una actualización de datos estos no podrán ser leídos por la primera hasta que la segunda transacción haya finalizado.

SERIALIZABLE

Si la segunda transacción tuviese un nivel de aislamiento SERIALIZABLE, la primera transacción no podría leer ninguna de las actualizaciones.

FOR UPDATE

Si con la primera transacción bloqueamos una fila o registros con un bloqueo, la segunda transacción no podría actualizar los datos.