En informática , ACID ( atomicidad , consistencia , aislamiento , durabilidad ) es un conjunto de propiedades de las transacciones de bases de datos que garantizan la validez de los datos a pesar de errores, cortes de energía y otros contratiempos. Por ejemplo, una transferencia de fondos de una cuenta bancaria a otra, que implica múltiples operaciones como el débito de una cuenta y el abono de otra, constituye una sola transacción.
En 1983, [ 1 ] Andreas Reuter y Theo Härder acuñaron el acrónimo ACID , basándose en trabajos anteriores de Jim Gray [ 2 ] quien denominó atomicidad, consistencia y durabilidad, pero no aislamiento, al caracterizar el concepto de transacción. Estas cuatro propiedades son las principales garantías del paradigma de transacciones, que ha influido en muchos aspectos del desarrollo de sistemas de bases de datos .
Según Gray y Reuter, el Sistema de Gestión de Información de IBM admitía transacciones ACID ya en 1973 (aunque el acrónimo se creó más tarde). [ 3 ]
BASE significa básicamente disponible , estado suave y eventualmente consistente : el acrónimo resalta que BASE es lo opuesto a ACID , como sus equivalentes químicos, ácido y base . Las bases de datos ACID priorizan la consistencia sobre la disponibilidad : toda la transacción falla si ocurre un error en cualquier paso dentro de la transacción; por el contrario, las bases de datos BASE priorizan la disponibilidad sobre la consistencia : en lugar de que falle la transacción, los usuarios pueden acceder temporalmente a datos inconsistentes : se logra la consistencia de los datos, pero no de inmediato . Una base de datos se inclina hacia ACID o BASE, pero no puede ser ambas (según el teorema CAP ). Por ejemplo, las bases de datos SQL (como MySQL , PostgreSQL , AWS RedShift ) están estructuradas sobre el modelo ACID, mientras que las bases de datos NoSQL (como DynamoDB [ 4 ] o MongoDB ) utilizan la arquitectura BASE. Sin embargo, algunas bases de datos NoSQL pueden exhibir ciertas características ACID. [ 5 ]
Características
Las características de estas cuatro propiedades, tal como las definen Reuter y Härder, son las siguientes:
Atomicidad
Las transacciones suelen estar compuestas por múltiples sentencias . La atomicidad garantiza que cada transacción se trate como una "unidad" única, que se completa con éxito o falla por completo: si alguna de las sentencias que la componen no se completa, la transacción entera falla y la base de datos permanece inalterada. Un sistema atómico debe garantizar la atomicidad en todas y cada una de las situaciones, incluyendo cortes de energía, errores y fallos del sistema. [ 6 ] Una garantía de atomicidad evita que las actualizaciones de la base de datos se produzcan solo parcialmente, lo que puede causar mayores problemas que rechazar toda la serie directamente. En consecuencia, otro cliente de la base de datos no puede observar que la transacción esté en curso. En un momento dado, aún no ha ocurrido, y en el siguiente, ya se ha completado (o no ha ocurrido nada si la transacción se canceló en curso).
Consistencia
La consistencia garantiza que una transacción solo pueda llevar la base de datos de un estado consistente a otro, preservando las invariantes de la base de datos : cualquier dato escrito en la base de datos debe ser válido según todas las reglas definidas, incluidas las restricciones , las cascadas , los disparadores y cualquier combinación de estos. Esto evita la corrupción de la base de datos por una transacción ilegal. Un ejemplo de invariante de la base de datos es la integridad referencial , que garantiza la relación entre la clave primaria y la clave externa . [ 7 ]
Aislamiento
Las transacciones suelen ejecutarse simultáneamente (por ejemplo, varias transacciones leen y escriben en una tabla al mismo tiempo). El aislamiento garantiza que la ejecución concurrente de transacciones deje la base de datos en el mismo estado que se habría obtenido si las transacciones se hubieran ejecutado secuencialmente. El aislamiento es el objetivo principal del control de concurrencia ; dependiendo del nivel de aislamiento utilizado, los efectos de una transacción incompleta podrían no ser visibles para otras transacciones. [ 8 ]
Durabilidad
La durabilidad garantiza que, una vez confirmada una transacción, permanecerá confirmada incluso en caso de fallo del sistema (por ejemplo, un corte de energía o un fallo del sistema). Esto generalmente significa que las transacciones completadas (o sus efectos) se registran en memoria no volátil . [ 9 ]
Ejemplos
Los siguientes ejemplos ilustran aún más las propiedades ACID. En estos ejemplos, la tabla de la base de datos tiene dos columnas, A y B. Una restricción de integridad exige que la suma de los valores de A y B sea igual a 100. El siguiente código SQL crea una tabla como se describe anteriormente:
CREATE TABLE acidtest ( A INTEGER , B INTEGER , CHECK ( A + B = 100 ));Atomicidad
La atomicidad garantiza que una serie de operaciones de base de datos en una transacción atómica se ejecutarán todas (una operación exitosa) o ninguna (una operación fallida). La serie de operaciones no puede separarse ejecutando solo algunas de ellas, lo que la hace "indivisible". La garantía de atomicidad impide que las actualizaciones de la base de datos se realicen solo parcialmente, lo que puede causar problemas mayores que rechazar la serie completa por completo. En otras palabras, atomicidad significa indivisibilidad e irreductibilidad. [ 10 ] Alternativamente, podemos decir que una transacción lógica puede estar compuesta por varias transacciones físicas. Hasta que todas las transacciones físicas que la componen se ejecuten, la transacción lógica no se habrá producido.
Un ejemplo de transacción atómica es una transferencia monetaria de la cuenta bancaria A a la cuenta B. Consta de dos operaciones: retirar el dinero de la cuenta A y depositarlo en la cuenta B. No querríamos ver el importe retirado de la cuenta A antes de estar seguros de que también se ha transferido a la cuenta B. Realizar estas operaciones en una transacción atómica garantiza que la base de datos permanezca en un estado consistente ; es decir, no se debita ni se acredita dinero si alguna de estas dos operaciones falla. [ 11 ]
Fallo de consistencia
La consistencia es un término muy general que exige que los datos cumplan con todas las reglas de validación. En el ejemplo anterior, la validación es un requisito que A + B = 100. Todas las reglas de validación deben verificarse para garantizar la consistencia. Supongamos que una transacción intenta restar 10 de A sin modificar B. Dado que la consistencia se verifica después de cada transacción, se sabe que A + B = 100 antes de que comience la transacción. Si la transacción resta 10 de A correctamente, se logrará la atomicidad. Sin embargo, una verificación de validación mostrará que A + B = 90 , lo cual es inconsistente con las reglas de la base de datos. Toda la transacción debe cancelarse y las filas afectadas deben revertirse a su estado anterior a la transacción. Si hubiera habido otras restricciones, disparadores o cascadas, cada operación de cambio se habría verificado de la misma manera que la anterior antes de que se confirmara la transacción. Pueden surgir problemas similares con otras restricciones. Es posible que hayamos requerido que los tipos de datos de A y B sean enteros. Si luego introdujéramos, por ejemplo, el valor 13.5 para A , la transacción se cancelaría o el sistema podría generar una alerta en forma de disparador (siempre que este se haya configurado para tal fin). Otro ejemplo serían las restricciones de integridad, que impedirían eliminar una fila de una tabla cuya clave primaria sea referenciada por al menos una clave foránea en otras tablas.
Fallo de aislamiento
Para demostrar el aislamiento, suponemos que dos transacciones se ejecutan simultáneamente, cada una intentando modificar los mismos datos. Una de ellas debe esperar a que la otra finalice para mantener el aislamiento.
Consideremos dos transacciones:
- T 1 transfiere 10 de A a B.
- T 2 transfiere 20 de B a A.
En conjunto, hay cuatro acciones:
- T 1 resta 10 de A.
- T 1 suma 10 a B.
- T 2 resta 20 de B.
- T 2 suma 20 a A.
Si estas operaciones se realizan en orden, se mantiene el aislamiento, aunque T2 deba esperar. Consideremos qué sucede si T1 falla a mitad del proceso. La base de datos elimina los efectos de T1 y T2 solo ve datos válidos.
Al intercalar las transacciones, el orden real de las acciones podría ser:
- T 1 resta 10 de A.
- T 2 resta 20 de B.
- T 2 suma 20 a A.
- T 1 suma 10 a B.
Consideremos nuevamente qué sucede si T1 falla al modificar B en el paso 4. Para cuando T1 falla , T2 ya ha modificado A; no se puede restaurar al valor que tenía antes de T1 sin dejar una base de datos inválida. Esto se conoce como una contención de escritura-escritura , [ 12 ] porque dos transacciones intentaron escribir en el mismo campo de datos. En un sistema típico, el problema se resolvería revirtiendo al último estado válido conocido, cancelando la transacción fallida T1 y reiniciando la transacción interrumpida T2 desde el estado válido.
Fallo de durabilidad
Consideremos una transacción que transfiere 10 de A a B. Primero, se retiran 10 de A y luego se suman 10 a B. En este punto, se le informa al usuario que la transacción fue exitosa. Sin embargo, los cambios aún permanecen en la cola de almacenamiento en disco , a la espera de ser guardados. Se produce un fallo eléctrico y los cambios se pierden, pero el usuario asume (comprensiblemente) que se conservan.
Implementación
El procesamiento de una transacción a menudo requiere una secuencia de operaciones que puede fallar por diversas razones. Por ejemplo, el sistema puede quedarse sin espacio en sus discos o haber agotado el tiempo de CPU asignado. Existen dos familias de técnicas populares: el registro de escritura anticipada (write-ahead logging) y la paginación en sombra (shadow paging ). En ambos casos, se deben adquirir bloqueos sobre toda la información que se va a actualizar y, según el nivel de aislamiento, posiblemente también sobre todos los datos que se puedan leer. En el registro de escritura anticipada, la durabilidad se garantiza escribiendo el cambio previsto en un registro persistente antes de modificar la base de datos. Esto permite que la base de datos vuelva a un estado consistente en caso de un fallo. En la paginación en sombra, las actualizaciones se aplican a una copia parcial de la base de datos, y la nueva copia se activa cuando se confirma la transacción.
Bloqueo frente a multiversión
Muchas bases de datos dependen del bloqueo para proporcionar funcionalidades ACID. El bloqueo implica que la transacción marca los datos a los que accede, de modo que el sistema de gestión de bases de datos (DBMS) sepa que no debe permitir que otras transacciones los modifiquen hasta que la primera transacción se complete con éxito o falle. El bloqueo siempre debe adquirirse antes de procesar los datos, incluso aquellos que se leen pero no se modifican. Las transacciones complejas suelen requerir un gran número de bloqueos, lo que genera una sobrecarga considerable y bloquea otras transacciones. Por ejemplo, si el usuario A está ejecutando una transacción que debe leer una fila de datos que el usuario B desea modificar, el usuario B debe esperar a que la transacción del usuario A finalice. El bloqueo en dos fases se suele aplicar para garantizar un aislamiento completo.
Una alternativa al bloqueo es el control de concurrencia multiversión , en el que la base de datos proporciona a cada transacción de lectura la versión anterior, sin modificar, de los datos que está siendo modificada por otra transacción activa. Esto permite a los lectores operar sin adquirir bloqueos; es decir, las transacciones de escritura no bloquean a las de lectura, y los lectores no bloquean a los escritores. Volviendo al ejemplo, cuando la transacción del usuario A solicita datos que el usuario B está modificando, la base de datos proporciona a A la versión de esos datos que existía cuando el usuario B inició su transacción. El usuario A obtiene una vista consistente de la base de datos incluso si otros usuarios están modificando datos. Una implementación, denominada aislamiento de instantánea , flexibiliza la propiedad de aislamiento.
Transacciones distribuidas
Garantizar las propiedades ACID en una transacción distribuida a través de una base de datos distribuida , donde ningún nodo individual es responsable de todos los datos que afectan a una transacción, presenta complicaciones adicionales. Las conexiones de red pueden fallar, o un nodo puede completar con éxito su parte de la transacción y luego verse obligado a revertir sus cambios debido a una falla en otro nodo. El protocolo de confirmación en dos fases (que no debe confundirse con el bloqueo en dos fases ) proporciona atomicidad para las transacciones distribuidas para asegurar que cada participante en la transacción esté de acuerdo en si la transacción debe confirmarse o no. [ 13 ] Brevemente, en la primera fase, un nodo (el coordinador) interroga a los demás nodos (los participantes), y solo cuando todos responden que están preparados, el coordinador, en la segunda fase, formaliza la transacción.
Véase también
Referencias
- ↑ Haerder, T. ; Reuter, A. (1983). "Principios de recuperación de bases de datos orientadas a transacciones". ACM Computing Surveys . 15 (4): 287. doi : 10.1145/289.291 . S2CID 207235758 .
- ↑ Gray, Jim (septiembre de 1981). "El concepto de transacción: virtudes y limitaciones" (PDF) . Actas de la 7.ª Conferencia Internacional sobre Bases de Datos Muy Grandes . Cupertino, California: Tandem Computers . págs. 144–154 . Consultado el 27 de marzo de 2015 .
- ↑ Gray, Jim ; Reuter, Andreas (1993). Procesamiento de transacciones distribuidas: conceptos y técnicas . Morgan Kaufmann . ISBN 1-55860-190-2.
- ↑ "Consistencia de lectura de DynamoDB - Amazon DynamoDB" . docs.aws.amazon.com . Consultado el 29/11/2025 .
Las operaciones de lectura como GetItem, Query y Scan ofrecen un parámetro opcional ConsistentRead. Si se establece ConsistentRead en true, DynamoDB devuelve una respuesta con los datos más actualizados, que reflejan las actualizaciones de todas las operaciones de escritura anteriores que se realizaron correctamente.
- ↑ "Bases de datos ACID vs BASE - Diferencia entre bases de datos - AWS" . Amazon Web Services, Inc. Consultado el 24 de marzo de 2025 .
- ↑ "Operación atómica" . webopedia.com . Webopedia. 25 de noviembre de 2003. Consultado el 23 de marzo de 2011.
Operación durante la cual un procesador puede leer y escribir simultáneamente en una ubicación de memoria en la misma operación de bus. Esto impide que cualquier otro procesador o dispositivo de E/S escriba o lea en la memoria hasta que la operación se complete.
- ↑ CJ Date, "SQL y teoría relacional: cómo escribir código SQL preciso, 2.ª edición", O'reilly Media, Inc. , 2012, pág. 180.
- ↑ Archiveddocs (04/10/2012). "Niveles de aislamiento en el motor de base de datos" . learn.microsoft.com . Consultado el 14/07/2023 .
- ↑ Silberschatz, Abraham; Korth, Henry F.; Sudarshan, S. (2011). «Transacciones». Conceptos de sistemas de bases de datos (6.ª ed.). Nueva York: McGraw-Hill. pág. 631. ISBN 978-0-07-352332-3OCLC 436031093
- ↑ "Atomicidad" . docs.oracle.com . Consultado el 13 de diciembre de 2016 .
- ↑ Amsterdam, Jonathan. "Transacciones de archivos atómicos, parte 1" . O'Reilly . Archivado del original el 3 de marzo de 2016. Consultado el 28 de febrero de 2016 .
- ↑ Silberschatz, Abraham; Korth, Henry F.; Sudarshan, S. (2011). «Desarrollo avanzado de aplicaciones». Conceptos de sistemas de bases de datos (6.ª ed.). Nueva York: McGraw-Hill. pág. 1042. ISBN 978-0-07-352332-3OCLC 436031093
- ↑ Bernstein, Philip A .; Newcomer, Eric (2009). «Capítulo 8». Principios del procesamiento de transacciones (2.ª ed.). Morgan Kaufmann (Elsevier). ISBN 978-1-55860-623-4Archivado del original el 7 de agosto de 2010.
- Sistemas de gestión de bases de datos
- Procesamiento de transacciones
- Control de concurrencia