Temario de listas educación Flashcards
¿Qué son los principios GRASP?
Son un conjunto de pautas generales para asignar responsabilidades a las clases en un diseño de software, con el objetivo de crear sistemas más mantenibles, reutilizables y fáciles de entender.
¿Cuál es el objetivo principal de los principios GRASP?
Mejorar la cohesión y el acoplamiento de las clases, lo que se traduce en un diseño más robusto y flexible.
¿Qué significa el acrónimo GRASP?
- General: Los principios son aplicables a una amplia gama de sistemas de software.
- Responsibility: Se refiere a la tarea o función que realiza una clase.
- Assignment: Indica cómo se asignan esas tareas a las clases.
- Software: Obviamente, se refiere al ámbito del desarrollo de software.
- Patterns: Son patrones o principios generales que se pueden aplicar repetidamente.
¿Qué son los principios SOLID?
Son cinco principios básicos de la programación orientada a objetos que buscan crear software más mantenible, flexible y extensible
¿Cómo se aplican los principios SOLID en un proyecto real?
Identificando las responsabilidades de cada clase, creando interfaces claras, utilizando herencia y polimorfismo de manera adecuada, y evitando acoplamientos innecesarios.
Principio de Responsabilidad Única (SRP)
Un concepto fundamental en la programación orientada a objetos que establece que una clase debe tener una única razón para cambiar. En otras palabras, una clase debe tener una sola responsabilidad bien definida.
¿Por qué es importante el SRP?
- Mantenibilidad: Al tener clases con responsabilidades bien delimitadas, es más fácil modificar el código sin afectar otras partes del sistema.
- Reutilización: Clases con una única responsabilidad son más fáciles de reutilizar en diferentes contextos.
- Pruebas: Las clases con una sola responsabilidad son más fáciles de probar de forma aislada.
- Comprensión: Un código más simple y enfocado es más fácil de entender y mantener.
Principio Abierto-Cerrado (OCP)
El Principio Abierto-Cerrado (OCP, por sus siglas en inglés) es uno de los cinco principios SOLID de la programación orientada a objetos. Establece que una entidad de software (como una clase o un módulo) debe estar abierta a extensiones pero cerrada a modificaciones.
* Abierta a extensiones: Significa que podemos añadir nuevas funcionalidades a una clase o módulo sin modificar su código existente. Por ejemplo, podemos crear subclases que hereden de una clase base y añadan nuevo comportamiento.
* Cerrada a modificaciones: Significa que una vez que una clase ha sido desarrollada y probada, no deberíamos tener que modificarla para añadir nuevas características.
¿Por qué es importante el OCP?
- Mantenibilidad: Al evitar modificar el código existente, se reduce el riesgo de introducir errores y se facilita la evolución del software a largo plazo.
- Reutilización: Las clases diseñadas siguiendo el OCP son más propensas a ser reutilizadas en diferentes partes de la aplicación.
- Flexibilidad: Los sistemas diseñados siguiendo el OCP se adaptan mejor a los cambios en los requisitos.
¿Cómo se aplica el OCP?
- Herencia: Creando clases hijas que heredan de una clase base y añaden nuevo comportamiento.
- Composición: Utilizando objetos de otras clases para agregar nuevas funcionalidades a una clase.
- Interfaces: Definiendo interfaces que especifican el comportamiento de un objeto, permitiendo que diferentes clases implementen esa interfaz de manera diferente.
Principio de Sustitución de Liskov (LSP)
El LSP es uno de los cinco principios SOLID de la programación orientada a objetos. En términos sencillos, establece que un objeto de una subclase debe poder reemplazar a un objeto de su clase base sin que se altere el correcto funcionamiento del programa.
¿Por qué es importante el LSP?
- Mantenibilidad: Facilita la modificación y ampliación del código, ya que permite sustituir objetos de una clase por otros de sus subclases sin la necesidad de grandes refactorizaciones.
- Reutilización: Fomenta la creación de código más genérico y reutilizable.
- Corrección: Garantiza que el comportamiento del programa sea predecible y correcto, evitando errores inesperados.
Violaciones del LSP
Una violación del LSP ocurre cuando una subclase no puede reemplazar completamente a su clase base sin alterar el comportamiento esperado del programa. Por ejemplo, si agregamos un método nadar() a la clase Canario y no a la clase Ave, estaríamos violando el LSP, ya que no todos los aves pueden nadar.
Principio de Segregación de Interfaz (ISP)
El Principio de Segregación de Interfaz (ISP) es uno de los cinco principios SOLID de la programación orientada a objetos. Establece que las interfaces deben ser específicas y enfocarse en los requerimientos de los clientes que las utilizan. En otras palabras, las interfaces deben ser lo más pequeñas y cohesivas posible, evitando incluir métodos que no son necesarios para todos los clientes.
¿Por qué es importante el ISP?
- Acoplamiento reducido: Al dividir las interfaces en partes más pequeñas, se reduce el acoplamiento entre las clases, lo que facilita los cambios y la mantenibilidad del código.
- Mayor cohesión: Las interfaces se vuelven más cohesivas, ya que cada una se enfoca en un conjunto específico de responsabilidades.
- Flexibilidad: Permite que las clases implementen solo las interfaces que realmente necesitan, evitando la implementación de métodos innecesarios.
Beneficios de aplicar el ISP
- Código más limpio y mantenible: Al dividir las interfaces en partes más pequeñas, el código se vuelve más fácil de entender y modificar.
- Menor riesgo de errores: Al evitar la implementación de métodos innecesarios, se reduce el riesgo de introducir errores en el código.
- Mayor flexibilidad: Permite agregar nuevas funcionalidades sin afectar a las clases existentes.
Principio de Inversión de Dependencia (DIP)
El Principio de Inversión de Dependencia (DIP) es uno de los cinco principios SOLID de la programación orientada a objetos. Establece que:
- Los módulos de alto nivel no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones.
- Las abstracciones no deben depender de detalles. Los detalles (implementaciones concretas) deben depender de abstracciones.
En términos más simples, el DIP sugiere que las clases de alto nivel, que contienen la lógica principal de una aplicación, no deben estar acopladas a las implementaciones concretas de las clases de bajo nivel, que suelen ser detalles de implementación. En su lugar, ambas deben depender de abstracciones como interfaces.
¿Por qué es importante el DIP?
- Desacoplamiento: Reduce el acoplamiento entre las diferentes partes de una aplicación, haciendo que sea más fácil de mantener y modificar.
- Reutilización: Facilita la reutilización de código, ya que las clases de alto nivel no están vinculadas a una implementación específica.
- Testabilidad: Permite realizar pruebas unitarias de forma más aislada, ya que se pueden inyectar fácilmente implementaciones simuladas de las dependencias.
- Flexibilidad: Hace que el sistema sea más flexible, ya que se pueden cambiar las implementaciones de las dependencias sin afectar a las clases de alto nivel.
Cómo aplicar el DIP
- Identificar las dependencias: Analiza tu código y encuentra las dependencias entre las clases.
- Crear abstracciones: Define interfaces o clases abstractas para representar las dependencias.
- Inyectar dependencias: Utiliza inyección de dependencias para proporcionar las implementaciones concretas a las clases que las necesitan.
En resumen, el DIP es un principio fundamental para construir sistemas de software más mantenibles, flexibles y testables. Al seguir este principio, se reduce el acoplamiento entre las diferentes partes de una aplicación, lo que facilita la evolución del software a lo largo del tiempo.
¿Qué significa YAGNI (You Aren’t Gonna Need It)?
YAGNI es un acrónimo que significa “You Aren’t Gonna Need It” (en español, “No lo vas a necesitar”). Es un principio de desarrollo de software que sugiere que no se deben implementar características o funcionalidades hasta que sean realmente necesarias.
¿Cuál es el objetivo principal de YAGNI?
El objetivo principal de YAGNI es evitar la sobre ingeniería y el desarrollo de código innecesario. Al enfocarse solo en las funcionalidades requeridas en el momento presente, se reduce la complejidad del proyecto, se ahorra tiempo y se mejora la mantenibilidad del código.
¿Por qué es importante seguir el principio YAGNI?
- Evita la acumulación de código técnico.
- Reduce el tiempo de desarrollo.
- Mejora la calidad del código.
- Facilita la comprensión y el mantenimiento del proyecto.
¿Cuál es la relación entre YAGNI y otros principios como KISS?
YAGNI está estrechamente relacionado con el principio KISS (Keep It Simple, Stupid). Ambos principios promueven la simplicidad y la eliminación de elementos innecesarios. KISS se enfoca en la solución más sencilla posible, mientras que YAGNI se centra en implementar solo lo estrictamente necesario.
¿Cómo se aplica YAGNI en la práctica?
- Priorizar las funcionalidades según las necesidades del usuario.
- Evitar la especulación sobre futuras necesidades.
- Realizar un análisis exhaustivo de los requisitos antes de comenzar a desarrollar.
- Revisar regularmente el código para eliminar partes innecesarias.
¿Qué es el patrón Singleton?
El patrón Singleton es un patrón de diseño creacional que garantiza que una clase tenga una única instancia, y proporciona un punto de acceso global a ella.
¿Cuál es el objetivo principal del patrón Singleton?
El objetivo principal es asegurar que exista un solo objeto de una clase en todo el sistema, evitando la creación de múltiples instancias.
¿En qué situaciones es útil el patrón Singleton?
- Necesitas un único punto de acceso a un recurso compartido.
- Requieres un objeto global que controle el estado de la aplicación.
- Deseas limitar la creación de objetos costosos.
¿Cuáles son las ventajas del patrón Singleton?
- Control estricto sobre la creación de objetos.
- Punto de acceso global a una instancia.
- Optimización en ciertos escenarios (por ejemplo, conexión a base de datos).
¿Cuáles son las desventajas del patrón Singleton?
- Violación del principio de responsabilidad única.
- Dificultad para probar el código.
- Puede hacer que el código sea menos flexible y más difícil de entender.
¿Cómo se implementa el patrón Singleton?
Generalmente se implementa creando una clase con un constructor privado para evitar la instanciación directa y un método estático para obtener la única instancia.
Ejemplos de uso del Singleton
- Gestor de configuración: Un único objeto para almacenar y acceder a la configuración de la aplicación.
- Conexión a base de datos: Una única conexión a la base de datos para toda la aplicación.
- Logger: Un único objeto para registrar eventos en la aplicación.
¿Qué es el patrón Adapter?
El patrón Adapter es un patrón de diseño estructural que permite que clases con interfaces incompatibles trabajen juntas. Es como un adaptador que convierte un enchufe de un tipo a otro para que puedas conectar un dispositivo a una fuente de alimentación diferente.
¿Cuál es el objetivo principal del patrón Adapter?
El objetivo principal es hacer que clases con interfaces diferentes puedan colaborar sin tener que modificar su código original.
¿En qué situaciones es útil el patrón Adapter?
- Necesitas utilizar una clase existente que tiene una interfaz diferente a la que necesitas.
- Quieres utilizar una nueva interfaz con una clase existente.
- Tienes que integrar componentes de diferentes frameworks o bibliotecas.
¿Cuáles son las ventajas del patrón Adapter?
- Reutilización de código existente.
- Aumento de la flexibilidad y extensibilidad del sistema.
- Mejora la compatibilidad entre diferentes componentes.
¿Cuáles son las desventajas del patrón Adapter?
- Puede añadir complejidad al sistema si se utiliza en exceso.
- Puede dificultar la comprensión del código si la adaptación es muy compleja.
¿Cómo se implementa el patrón Adapter?
Generalmente se crea una nueva clase que implementa la interfaz deseada y delega las llamadas a la clase existente que se quiere adaptar.
¿Qué es el patrón Builder?
El patrón Builder es un patrón de diseño creacional que te permite construir objetos complejos paso a paso, separando la construcción de un objeto de su representación. Es como construir una casa ladrillo a ladrillo, en lugar de crearla de una sola vez.
¿Cuál es el objetivo principal del patrón Builder?
El objetivo principal es crear objetos complejos de manera flexible y controlada, permitiendo diferentes representaciones del mismo objeto.
¿En qué situaciones es útil el patrón Builder?
- Necesitas crear objetos con muchos parámetros o configuraciones.
- Quieres separar la construcción de un objeto de su representación.
- Necesitas crear diferentes representaciones del mismo objeto.
¿Cuáles son las ventajas del patrón Builder?
- Mayor control sobre el proceso de construcción.
- Mejora la legibilidad del código.
- Facilita la creación de objetos complejos.
- Permite crear diferentes representaciones del mismo objeto.
¿Cuáles son las desventajas del patrón Builder?
- Puede añadir complejidad a proyectos sencillos.
- Requiere más código que crear objetos directamente.
¿Cómo se implementa el patrón Builder?
Generalmente se crea una interfaz Builder que define los métodos para construir las diferentes partes del objeto. Luego se crean clases concretas que implementan esta interfaz y se encargan de construir el objeto paso a paso.
¿Qué es el patrón Factory?
El patrón Factory es un patrón de diseño creacional que proporciona una interfaz para crear objetos, pero deja a las subclases decidir qué clase instanciar. Es como una fábrica que produce diferentes tipos de productos, pero el proceso de producción se delega a las líneas de producción específicas.
¿Cuál es el objetivo principal del patrón Factory?
El objetivo principal es abstraer la creación de objetos, permitiendo que el código cliente se desacople de las clases concretas que se están instanciando.
¿En qué situaciones es útil el patrón Factory?
- Necesitas crear objetos de diferentes clases relacionadas.
- Quieres centralizar la lógica de creación de objetos.
- Deseas ocultar la complejidad de la creación de objetos al cliente.
- Necesitas agregar nuevos tipos de objetos sin modificar el código cliente.
¿Cuáles son las ventajas del patrón Factory?
- Aumenta la flexibilidad del sistema.
- Mejora la mantenibilidad del código.
- Facilita la introducción de nuevos tipos de objetos.
- Oculta la complejidad de la creación de objetos.
¿Cuáles son las desventajas del patrón Factory?
- Puede introducir una capa adicional de abstracción.
- Puede ser excesivo para casos simples.
¿Cómo se implementa el patrón Factory?
Generalmente se crea una clase abstracta o interfaz que define un método para crear objetos. Las subclases de esta clase implementan este método para crear objetos concretos.
¿Qué es la encapsulación?
La encapsulación es el principio que consiste en ocultar los detalles internos de un objeto, exponiendo solo una interfaz pública para interactuar con él.
¿Cuál es su objetivo de la encapsulación?
Proteger los datos internos de un objeto de modificaciones no autorizadas y facilitar el mantenimiento del código.
¿Qué es la abstracción?
La abstracción consiste en identificar las características esenciales de un objeto y omitir los detalles innecesarios.
¿Cuál es su objetivo de la abstracción?
Simplificar la complejidad de un sistema al modelar objetos del mundo real de manera más sencilla.
¿Qué es la herencia?
La herencia es un mecanismo que permite a una clase (subclase o clase hija) heredar atributos y métodos de otra clase (superclase o clase padre).
¿Cuál es su objetivo de la herencia?
Promover la reutilización de código y establecer relaciones jerárquicas entre clases.
¿Qué es el polimorfismo?
El polimorfismo es la capacidad de que objetos de diferentes clases puedan ser tratados como si fueran de la misma clase.
¿Cuál es su objetivo el polimorfismo?
Aumentar la flexibilidad y extensibilidad del código, permitiendo que diferentes objetos respondan de manera diferente al mismo mensaje.
¿Qué es DevOps?
DevOps es una metodología que combina el desarrollo de software (Dev) y las operaciones (Ops) con el objetivo de acortar el ciclo de vida de desarrollo de sistemas y proporcionar una entrega continua de valor al cliente.
¿Cuál es la importancia de la colaboración entre desarrolladores y equipos de operaciones en DevOps?
La colaboración estrecha y la comunicación efectiva entre equipos son fundamentales para romper silos y garantizar un flujo de trabajo continuo.
¿Por qué la automatización es clave en DevOps?
La automatización de tareas repetitivas, como la construcción, la prueba y el despliegue, reduce errores humanos, aumenta la velocidad y mejora la eficiencia.
¿Qué es la integración continua (CI) y cuál es su papel en DevOps?
La CI es la práctica de integrar el código de forma frecuente en un repositorio compartido. Ayuda a detectar errores temprano y a mantener una base de código estable.
¿Qué es la entrega continua (CD) y cómo se relaciona con la CI?
La CD es la práctica de desplegar automáticamente el software en producción después de cada cambio exitoso. Complementa la CI al garantizar que el software esté siempre listo para ser lanzado.
¿Por qué el monitoreo y la retroalimentación son esenciales en DevOps?
El monitoreo continuo permite identificar problemas y cuellos de botella en la producción, mientras que la retroalimentación ayuda a mejorar los procesos y tomar decisiones basadas en datos.
¿Cómo se fomenta una cultura de mejora continua en DevOps?
Fomentando la experimentación, la innovación y la retroalimentación constante, así como creando un ambiente de aprendizaje y colaboración.
¿Cuáles son las herramientas más comunes utilizadas en DevOps?
- Control de versiones: Git
- Automatización: Jenkins, Ansible, Puppet, Chef
- Contenedores: Docker
- Orquestación de contenedores: Kubernetes
- Nube: AWS, Azure, GCP
- Monitoreo: Prometheus, Grafana
¿Cuáles son los beneficios de adoptar DevOps?
DevOps ofrece numerosos beneficios, como una mayor velocidad de entrega, una mejor calidad de software, una mayor fiabilidad, una mayor eficiencia y una mayor satisfacción del cliente.
¿Qué es el testing?
El testing es el proceso de evaluar un producto para verificar que cumple con los requisitos especificados y para detectar defectos.
¿Cuáles son los tipos de testing más comunes?
Unit testing, integración testing, sistema testing, aceptación testing, etc.
¿Cuál es la diferencia entre testing manual y automatizado?
El testing manual se realiza por un tester humano, mientras que el testing automatizado utiliza herramientas para ejecutar pruebas de forma repetitiva.
¿Por qué es importante el testing?
Asegura la calidad del software, reduce costos a largo plazo, mejora la satisfacción del cliente y previene fallos en producción.
¿Qué es TDD (Desarrollo Guiado por Pruebas)?
TDD es una metodología de desarrollo de software donde se escriben las pruebas unitarias antes de escribir el código de producción.
¿Cuáles son las tres leyes del TDD?
- No puedes escribir código de producción sin antes hacer un test fallido.
- No puedes escribir más de un único test unitario, con el suficiente código para hacerlo fallar.
- Solo puedes escribir código de producción para hacer pasar el único test fallido.
¿Cuáles son las ventajas de TDD?
Mejora la calidad del código, facilita el refactoring, aumenta la cobertura de código y promueve un diseño más limpio.
¿Cuáles son los desafíos de TDD?
Puede aumentar el tiempo inicial de desarrollo, requiere disciplina y práctica, y puede ser difícil de aplicar en proyectos heredados.
¿Qué significa CI/CD?
CI significa Integración Continua y CD significa Entrega Continua (o Despliegue Continuo). Es un conjunto de prácticas que automatizan el proceso de desarrollo de software, desde la integración de código hasta su despliegue en producción.
¿Cuál es el objetivo principal de CI/CD?
Acelerar el tiempo de salida al mercado, mejorar la calidad del software, reducir errores y aumentar la frecuencia de despliegues.
¿Cuáles son las etapas típicas de un pipeline de CI/CD?
Comienza con el commit de código, seguido de la construcción, pruebas unitarias, pruebas de integración, pruebas de despliegue, y finalmente el despliegue en producción.
¿Qué papel juega el control de versiones en CI/CD?
El control de versiones (como Git) es fundamental para gestionar los cambios en el código y rastrear la historia de desarrollo.
¿Qué es un pipeline de CI/CD?
Un pipeline de CI/CD es una serie automatizada de pasos que transforma el código desde su commit hasta su despliegue en producción.
¿Cuáles son algunas herramientas populares para implementar CI/CD?
Jenkins, GitLab CI/CD, CircleCI, GitHub Actions, Bamboo.
¿Qué papel juegan los contenedores (Docker) en CI/CD?
Los contenedores proporcionan un entorno de ejecución consistente y aislado para las aplicaciones, facilitando la portabilidad y la escalabilidad.
¿Qué es la orquestación de contenedores (Kubernetes)?
La orquestación gestiona la implementación, escalado y administración de contenedores a gran escala.
¿Cuáles son los principales beneficios de adoptar CI/CD?
Mayor frecuencia de despliegues, mejor calidad del software, detección temprana de errores, reducción del tiempo de resolución de problemas, y mayor colaboración entre equipos.
¿Cuáles son los desafíos comunes al implementar CI/CD?
Resistencia al cambio, complejidad de la configuración, necesidad de automatización, gestión de dependencias.
¿Cómo se asegura la calidad del software en un entorno CI/CD?
A través de pruebas exhaustivas en cada etapa del pipeline, incluyendo pruebas unitarias, de integración, de despliegue y de usuario.
¿Qué es la arquitectura hexagonal?
La arquitectura hexagonal es un patrón de diseño que busca desacoplar la lógica de negocio de una aplicación de sus tecnologías externas como bases de datos, frameworks, UI, etc. Esto se logra encapsulando la lógica de negocio en un núcleo central y definiendo una interfaz clara (puertos) para interactuar con el mundo exterior.
¿Cuáles son los beneficios de usar arquitectura hexagonal?
Mayor testabilidad, independencia de tecnologías, mayor flexibilidad para cambios, mejor mantenibilidad y escalabilidad.
¿En qué tipo de proyectos es especialmente útil?
Es ideal para proyectos grandes y complejos, donde se espera que los requisitos cambien con el tiempo y se requiera una alta adaptabilidad.
¿Cuáles son los componentes principales de la arquitectura hexagonal?
Núcleo (dominio), puertos, adaptadores, infraestructura.
¿Cuál es la función del núcleo de la arquitectura hexagonal?
Contiene la lógica de negocio y las reglas de dominio, sin dependencias externas.
¿Qué son los puertos y adaptadores?
Los puertos definen el contrato que el núcleo expone al mundo exterior, mientras que los adaptadores implementan ese contrato utilizando tecnologías específicas.
¿Cuál es el principio fundamental de la inversión de control en la arquitectura hexagonal?
El núcleo no debe conocer las implementaciones concretas de los adaptadores, sino que depende de las abstracciones definidas por los puertos.
¿Cómo se aplica la inyección de dependencias en este patrón?
Se utiliza para inyectar las dependencias del núcleo a través de los puertos, lo que permite cambiar las implementaciones de los adaptadores sin modificar el núcleo.
¿Cómo se diferencia la arquitectura hexagonal de la arquitectura en capas?
La arquitectura hexagonal invierte las dependencias, haciendo que el núcleo sea independiente de las capas externas, mientras que la arquitectura en capas suele tener dependencias unidireccionales.
¿Cuál es la relación entre la arquitectura hexagonal y microservicios?
La arquitectura hexagonal puede ser aplicada a cada microservicio, proporcionando una base sólida para su desarrollo.
¿Qué son las propiedades ACID?
ACID es un acrónimo de Atomicidad, Consistencia, Aislamiento y Durabilidad. Son propiedades fundamentales de las transacciones en bases de datos relacionales que garantizan la integridad y fiabilidad de los datos.
¿Cuál es la importancia de las propiedades ACID?
Las propiedades ACID aseguran que las transacciones se completen de manera confiable y que los datos se mantengan consistentes, incluso en caso de fallas del sistema.
¿Qué significa cada letra de ACID?
- Atomicidad: Una transacción se ejecuta como una unidad indivisible. O se completa toda o ninguna de sus operaciones.
- Consistencia: Una transacción mueve la base de datos de un estado consistente a otro. Las reglas de integridad se mantienen siempre.
- Aislamiento: Las transacciones concurrentes no interfieren entre sí. Cada transacción ve una vista consistente de la base de datos.
- Durabilidad: Una vez que una transacción se ha comprometido, los cambios son permanentes y sobrevivirán a fallos del sistema.
¿Cuáles son algunos ejemplos de cómo se aplican las propiedades ACID en la vida real?
- Atomicidad: Transferencia bancaria: Si se debita dinero de una cuenta, el crédito debe realizarse en otra cuenta simultáneamente.
- Consistencia: Reservas de vuelos: Al reservar un vuelo, la disponibilidad de los asientos debe actualizarse de forma consistente.
- Aislamiento: Múltiples usuarios que consultan un saldo bancario al mismo tiempo no deben ver datos inconsistentes.
- Durabilidad: Los datos de una transacción comprometida no se perderán, incluso si se produce un apagón.
¿Qué ocurre si no se cumplen las propiedades ACID?
Si no se cumplen las propiedades ACID, pueden ocurrir problemas como pérdida de datos, inconsistencias en la base de datos y resultados impredecibles en las aplicaciones.
¿Cómo garantizan los SGBDR las propiedades ACID?
Los SGBDR utilizan diversos mecanismos, como el registro de transacciones, los puntos de control y los bloqueos, para asegurar que las transacciones cumplan con las propiedades ACID.
¿Qué es una transacción?
Una transacción es una secuencia de operaciones que se ejecutan como una unidad atómica.