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.