ACID en Las Bases de Datos
ACID en Las Bases de Datos
ACID en Las Bases de Datos
En el mundo de las bases de datos es muy común escuchar hablar del concepto ACID.
ACID es un grupo de 4 propiedades que garantizan que las transacciones en las bases de
datos se realicen de forma confiable. Veamos en detalle este interesante concepto.
En 1970, Jim Gray definió las propiedades que necesitaba tener una transacción
confiable, y desarrolló tecnologías para automatizarlas. Más tarde, en 1983, Andreas
Reuter y Theo Härder crearon el término "ACID" para describir estas 4 propiedades.
Sobre la Consistencia
La consistencia asegura que los cambios a los valores de una instancia son consistentes
con cambios a otros valores de la misma instancia. Una restricción de consistencia es un
predicado sobre los datos que funcionan como precondición, postcondición, y condición
de transformación en cualquier transacción. El sistema de la base de datos asume que la
consistencia se mantiene para cada transacción en las instancias. Por otro lado, asegurar
la propiedad de consistencia de la transacción es responsabilidad del usuario.
Sobre el Aislamiento
De las 4 propiedades de ACID en los sistemas de bases de datos, generalmente la
propiedad de Aislamiento es la más relajada. Cuando se intenta mantener el más alto
nivel de aislamiento, las bases de datos adquieren un bloqueo o implementan un control
concurrente multiversión, que puede resultar en pérdida de concurrencia. Esto genera
que la aplicación agregue lógica para funcionar correctamente.
Serializable
Este es el nivel más alto de aislamiento. En una base de datos con control concurrente
basado en bloqueos, la serialización requiere que los bloqueos de lectura y escritura
(que se adquieren en datos seleccionados) sean liberados al finalizar la transacción.
También se pueden adquierir bloqueos de rango cuando se realiza un query SELECT
con una cláusula WHERE, especialmente cuando se quieren evitar lecturas fantasma.
En una base de datos con control concurrente no basado en bloqueos, no se necesitan los
bloqueos; sin embargo, si el sistema detecta una colisión de escritura entre muchas
transacciones concurrentes, sólo se permite el commit de una de estas transacciones.
Lecturas repetibles (repeatable reads)
En este nivel de aislamiento, un sistema de control de concurrencia basado en bloqueos
mantiene los bloqueos de escritura y lectura (que se adquieren en datos seleccionados)
hasta el final de la transacción. Sin embargo, no se gestionan los bloqueos de rango, por
lo tanto podrían ocurrir lecturas fantasma.
Lecturas sobre commits (read commited)
En este nivel de aislamiento, un sistema de control de concurrencia basado en bloqueos
mantiene los bloqueos de escritura (que se adquieren en datos seleccionados) hasta el
final de la transacción, pero los bloqueos de lectura se liberan ni bien se realiza la
operación de SELECT (y por lo tanto pueden ocurrir lecturas no-repetibles). Igual que
el nivel anterior, no se permiten bloqueos de rango.
Lecturas sin commits (read uncommited)
Este es el nivel más bajo de aislamiento. En este nivel se permiten las lecturas sucias,
por lo cual una transacción podría ver cambios de otra transacción que todavía tuvieron
un commit.
Consecuencia sobre las lecturas
El estandar ANSI/ISO SQL 92 se refiere a tres distintos fenómenos sobre la lectura que
ocurren cuando la Transacción 1 lee datos que la Transacción 2 puede haber cambiado.
Lecturas sucias
Las lecturas sucias ("dirty reads") ocurren cuando se permite que una transacción lea
una fila que fue modificada por otra transacción que todavía no hizo commit. Las
lecturas sin commit funcionan igual que las lecturas no-repetibles; sin embargo, la
segunda transacción no necesita haber hecho commit para que el primer query devuelva
datos distintos. Lo único que puede prevenirse en el nivel de aislamiento "Lecturas sin
commit" es que las actualizaciones aparezcan fuera de órden.
Lecturas no-repetibles
Una lectura no-repetible ocurre cuando, durante el curso de una transacción, se recupera
una fila dos veces y el valor de la fila difiere entre las lecturas. En las bases de datos con
control de concurrencia basado en bloqueos, el fenómeno de lecturas no-repetibles
puede ocurrir cuando no se adquieren bloqueos de lectura al ejecutar un SELECT, o
cuando los bloqueos adquieridos en las filas afectadas se liberan ni bien se ejecuta la
operación de SELECT.
Lecturas fantasma
Una lectura fantasma ocurre cuando, durante el curso de una transacción, se ejecutan
dos queries idénticos, y la colección de filas retornada por el segundo query es diferente
al primero. Esto puede ocurrir cuando no se adquieren bloqueos de rango al ejecutar una
operación SELECT...WHERE. Las lecturas fantasma son un caso especial de las
lecturas no-repetibles, cuando la transacción 1 repite la consulta rango
SELECT...WHERE y, entre ambas consultas, la Transacción 2 crea (INSERT) nuevas
filas que cumplen con la condición del WHERE.
Sobre la Durabilidad
La durabilidad es la propiedad que garantiza que las transacciones que tuvieron un
commit sobrevivan de forma permanente.