Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Las operaciones dentro de una transacción deben ser atómicas. Esto significa
que todas las operaciones tienen éxito o fallan. Esta es la regla de todo o nada. La
consistencia garantiza que la base de datos se encuentre en un estado consistente
una vez finalizada la transacción, los datos son válidos y no hay registros a medio
terminar. Por ejemplo, no quedan clientes sin registros de pago o no hay registros
de pago sin clientes.
El aislamiento es el requisito de que otras operaciones no puedan acceder a
los datos que se han modificado durante una transacción que aún no se ha
completado, el aislamiento ocurre en caso de transacciones concurrentes. Sin
aislamiento, los datos pueden terminar en un estado inconsistente. La durabilidad
es la capacidad del sistema de base de datos para poder recuperarse en caso que
se presenten transacciones comprometidas contra cualquier tipo de falla del
sistema.
Niveles de aislamiento
Pues bien, repasado este concepto ya podemos mostrar los problemas asociados a los
leer el resultado de otras transacciones aún no confirmadas. Por ejemplo, vamos a suponer que
Inicialmente la transacción A lee un valor X de una tabla que, por ejemplo, es 0. Durante
que está usando A y que aún no se ha cometido. Supongamos que ahora se anula la
Supongamos que una transacción activa, A, lee un valor X = 0. En este momento otra
ahora durante la transacción A se vuelve a leer el valor X obtendríamos 10 en lugar del 0 que
se esperaba. Aunque a primera vista este problema no parezca muy importante en realidad sí
que lo es, sobre todo cuando X es una clave primaria o ajena. En este caso se puede originar
transacciones. Sucede cuando una transacción en un momento lanza una consulta de selección
con una condición y recibe en ese momento N filas y posteriormente vuelve a lanzar la misma
consulta junto con la misma condición y recibe M filas con M > N. Esto es debido a que durante
el intervalo que va de la primera a la segunda lectura se insertaron nuevas filas que cumplen la
levels) para solventarlos. Hay que tener en cuenta que a mayor nivel de aislamiento mayores
son los sacrificios que se hacen con respecto a la concurrencia y al rendimiento. Vamos a
este nivel de aislamiento ya que es propenso a sufrir todos los problemas anteriormente
descritos. En este nivel una transacción puede ver los resultados de transacciones aún no
cometidas. Podemos apreciar que en este nivel no existe aislamiento alguno entre
transacciones.
gestores de bases de datos relacionales. Supone que dentro de una transacción únicamente se
pueden ver los cambios de las transacciones ya cometidas. Soluciona el problema de las
lecturas sucias, pero no el de las lecturas no repetibles ni tampoco el de las lecturas fantasmas.
Repeatable read (Lectura repetible): Define que cualquier tupla leída durante el
lecturas sucias, el problema de las lecturas no repetibles. Aunque en dicho nivel se siguen
Serializable (Lecturas en serie): Soluciona todos los problemas descritos. Para ello
ordena las transacciones con el objetivo de que no entren en conflicto. Este nivel de aislamiento
es bastante problemático ya que es, con diferencia, el que más sacrifica en rendimiento y
concurrencia.
Serializable No No No
Repeatable read Si No No
Read committed Si Si No
Nivel de aislamiento Lecturas fantasma Lecturas no repetibles Lecturas sucias
Read uncommitted Si Si Si
repetible).
1
2
3
4
5
6
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
ISOLATION LEVEL.
Autocommit
MySQL también comete automáticamente las consultas que no son parte de una
transacción. Los resultados de cualquier consulta ya sea ACTUALIZAR o INSERTAR que no
esté precedida por un START TRANSACTION serán visibles inmediatamente para todas las
conexiones.
1
2
3
4
5
6
mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
Creamos una tabla de Test con el motor de almacenamiento InnoDB, que admite transacciones.
1
2
3
4
5
6
7
8
mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
Ahora insertamos los valores 4, 5 nuevamente. Esta vez, los registros se guardan
ningún efecto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> INSERT INTO Test VALUES (4), (5);
mysql> COMMIT;
mysql> ROLLBACK;
Transacciones
Con autocommit habilitado, cada instrucción SQL se ajusta automáticamente en su propia
de la transacción.
Trabajaremos con la misma tabla Test. Truncamos los datos en la tabla.
1
2
3
4
5
mysql> TRUNCATE Test;
Query OK, 0 rows affected (0.02 sec)
Comenzamos una transacción e insertamos cuatro registros en la tabla. Los valores aún
Sin embargo, desde una conexión diferente, la tabla Test está vacía. Abrimos una nueva
conexión MySQL. Esta es una conexión diferente de la que insertamos los registros. Desde esta
Type 'help;' or '\h' for help. Type '\c' to clear the current input state
ment.
mysql> ROLLBACK;
En el código SQL anterior, comenzamos una nueva transacción. Insertamos cuatro valores
en la tabla Test. Revertimos los cambios con la instrucción ROLLBACK. La consulta posterior