Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
Atomicidad
La Atomicidad requiere que cada transacción sea "todo o nada": si una parte de la
transacción falla, todas las operaciones de la transacción fallan, y por lo tanto la base de
datos no sufre cambios. Un sistema atómico tiene que garantizar la atomicidad en
cualquier operación y situación, incluyendo fallas de alimentación eléctrica, errores y
caidas del sistema.
Sobre la Atomicidad
En una transacción atómica, una serie de operaciones en la base de datos ocurren todas,
o no ocurre ninguna. La atomicidad previene que las actualizaciones a la base ocurren de
forma parcial, lo cual podría ocasionar mayores problemas que rechazar la transacción
entera. En otras palabras, la atomicidad significa indivisibilidad e irreducibilidad.
Consistencia
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.
aIslamiento
Sobre el Aislamiento
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.
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.
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
Durabilidad
La durabilidad significa que una vez que se confirmó una transacción (commit), quedará
persistida, incluso ante eventos como pérdida de alimentación eléctrica, errores y caidas
del sistema. Por ejemplo, en las bases de datos relacionales, una vez que se ejecuta un
grupo de sentencias SQL, los resultados tienen que almacenarse inmediatamente (incluso
si la base de datos se cae inmediatamente luego).
Sobre la Durabilidad