LaACID es un concepto (y un acrónimo) que hace referencia a las cuatro propiedades de una transacción en un sistema de base de datos, que son: Atomicidad, Consistencia, Aislamiento y Durabilidad. Estas propiedades aseguran la exactitud e integridad de los datos en la base de datos, asegurando que los datos no se corrompan como consecuencia de algún fallo, garantizando la validez de los datos aunque se produzcan errores o fallos.
Las propiedades ACID nos permiten escribir aplicaciones sin tener en cuenta la complejidad del entorno donde se ejecuta la aplicación. Esto es esencial para el procesamiento de transacciones en bases de datos. Gracias a las propiedades ACID, podemos centrarnos en la lógica de la aplicación en lugar de en los fallos, la recuperación y la sincronización de los datos.
Transacción
Antes de explicar las cuatro propiedades ACID, debemos entender qué es una transacción. Una transacción es una secuencia de operaciones que se ejecutan como una sola unidad de trabajo, y una transacción puede consistir en uno o muchos pasos. Una transacción accede a los datos mediante operaciones de lectura y escritura.
Cada transacción es un grupo de operaciones que actúa como una única unidad, produce resultados consistentes, actúa de forma aislada de otras operaciones y las actualizaciones que realiza se almacenan de forma duradera.
El objetivo de una transacción es preservar la integridad y consistencia de los datos. Si una transacción tiene éxito, los datos que fueron modificados durante la transacción serán guardados en la base de datos. Si se produce algún error y hay que cancelarla o revertirla, los cambios que se hicieron en los datos no se aplicarán.
Cuando trabajamos con una base de datos, ejecutamos declaraciones SQL, y esas operaciones se ejecutan generalmente en bloques, y esos bloques son las transacciones. Permiten insertar, actualizar, borrar, buscar datos, etc.
Por ejemplo, transferir dinero entre cuentas bancarias es una transacción, lo que ocurrirá en este caso es que el valor debe ser cargado en una cuenta y acreditado en otra.
Atomicidad
Una transacción debe ser una unidad atómica de trabajo, lo que significa que todos los datos modificados se ejecutan o ninguno de ellos lo hará. La transacción debe ejecutarse completamente o fallar completamente, si una parte de la transacción falla, toda la transacción fallará. Esto proporciona fiabilidad porque si hay un fallo en medio de una transacción, ninguno de los cambios de esa transacción se comprometerá.
Por ejemplo, en una transacción financiera, el dinero sale de la cuenta A y va a la cuenta B, ambas operaciones deben ejecutarse juntas, y si una de ellas falla, la otra no se ejecutará. Así que la transacción se trata como una sola entidad, como una sola orden. Una transacción puede tener más de dos operaciones, pero siempre se ejecutarán todas o ninguna. En este ejemplo, cuando se está transfiriendo el dinero de la cuenta A a la cuenta B, si algo falla, se abortará toda la transacción y se hará rollback.
Consistencia
Esta propiedad asegura que la transacción mantiene las restricciones de integridad de los datos, dejándolos consistentes. La transacción crea un nuevo estado válido de los datos y si ocurre algún fallo, devuelve todos los datos con el estado anterior a la transacción que se está ejecutando.
El objetivo es asegurar que la base de datos antes y después de la transacción sea consistente. Si una transacción deja los datos en un estado no válido, la transacción se aborta y se informa de un error.
Los datos que se guardan en la base de datos deben ser siempre válidos (los datos serán válidos según las reglas definidas, incluyendo cualquier restricción, cascada y triggers que se hayan aplicado sobre la base de datos), de esta forma se evita la corrupción de la base de datos que puede provocar una transacción ilegal. Por ejemplo, si intentamos añadir un registro en una tabla de ventas con el código de un producto que no existe en la tabla de productos, la transacción fallará. Otro ejemplo, si tenemos una columna que no permite números negativos, e intentamos añadir o modificar un registro, utilizando un valor inferior a cero en esta columna, la transacción fallará.
Aislamiento
Esta propiedad asegura el aislamiento de cada transacción, asegurando que la transacción no será modificada por ninguna otra transacción concurrente. Significa que cada transacción en curso no será interferida por ninguna otra transacción hasta que se complete.
Por ejemplo, si dos clientes están intentando comprar al mismo tiempo el último producto disponible en el sitio web, cuando el primer usuario termine la compra, hará que la transacción del otro usuario se interrumpa.
Durabilidad
Una vez que una transacción se completa y se compromete, sus cambios se persisten permanentemente en la base de datos. Esta propiedad asegura que la información que se guarda en la base de datos es inmutable hasta que otra transacción de actualización o borrado la afecte.
Una vez que la transacción se ha consignado, permanecerá en este estado aunque se produzca un problema grave, como una caída o un corte de energía. Para ello, las transacciones completadas se registran en dispositivos de memoria permanente (no volátil) como los discos duros, por lo que los datos estarán siempre disponibles, aunque se reinicie la instancia de la BD.
Conclusión
Las propiedades ACID aseguran la integridad y la consistencia de los datos en la base de datos, garantizando que los datos no se corrompan como consecuencia de algún fallo. Las bases de datos que apliquen las propiedades ACID asegurarán que sólo se procesen las transacciones que hayan sido completamente exitosas, y si ocurre algún fallo antes de que se complete una transacción, los datos no se modificarán.