La gestión de transacciones es fundamental e integral en las aplicaciones empresariales para garantizar la preservación de la consistencia e integridad de los datos. Una transacción, desde el punto de vista de una base de datos, representa una unidad lógica de trabajo que abarca una o múltiples operaciones de base datos(insertar, update, borrar).
Jakarta EE, al igual que su predecesor JavaEE, ofrece una abstracción integral para gestionar transacciones, ya sea programáticamente a través de las API de JTA o de manera declarativa mediante anotaciones. Esta última es más popular debido a su simplicidad y la capacidad de mantener límites de transacción claros sin abrumar el código lógico del negocio. En este artículo, exploraremos la anotación @Transactional en Jakarta EE, y veremos diferentes comportamientos bajo varias configuraciones y algunas mejores prácticas.
La Anotación @Transactional
La anotación @Transactional es la que ofrece las capacidades de gestión de transacciones declarativas de Jakarta EE. Básicamente, cuando un método está decorado con @Transactional, Jakarta EE se asegura de que se inicie una transacción antes de la ejecución del método y posteriormente se confirme si la ejecución continúa normalmente, o se revierta si se produce una excepción.
Por defecto, la anotación @Transactional tiene un comportamiento de propagación REQUERIDO. Es decir, Si hay una transacción activa, únase a ella. Si no hay una transacción activa, inicie una nueva.
@StatelesspublicclassMyService{@InjectprivateMyRepositoryrepository;@TransactionalpublicvoidperformBusinessOperation(){// lógica del negociorepository.save(entity);}}
En el ejemplo anterior, invocar performBusinessOperation() inicializa una nueva transacción. Cuando save() se llama posteriormente dentro de esa transacción, save() se une a la transacción existente en lugar de iniciar una nueva debido a su comportamiento de propagación REQUERIDO por defecto.
Sin embargo, vale la pena señalar que el uso superfluo de anotaciones @Transactional, especialmente cuando las transacciones ya están definidas en la capa de servicio, puede provocar confusión y comportamientos no anticipados. Por lo tanto, generalmente es una buena práctica definir transacciones a nivel de operaciones comerciales (como en la capa de servicio).
Manejo de errores (RollBack/Deshacer)
La anotacion @Transactional no es magica, hay alcances y caracteristicas que se deben manejar como el asilamiento de la persistencia de datos y el RollBack, esto se logra lanzando excpeciones del tipo Runtime, si usa una excepcion custom, esta debe heredar o ser del tipo Runtime.
Mejores Prácticas
Los límites de transacción deben reflejar los requisitos comerciales. Por lo general, es recomendable iniciar una nueva transacción para cada operación comercial distinta. Las demarcaciones de transacciones suelen ser mejor ubicadas en la capa de servicio, que se alinea bien con la comprensión de las operaciones comerciales. Por otro lado, anotar cada método a nivel de repositorio puede hacer que cada operación CRUD sea transaccional y, en consecuencia, puede crear una multitud de transacciones breves.
Sin embargo, vale la pena considerar el costo de una transacción. Cuanto más larga sea una transacción, más tiempo persistirán los bloqueos en los datos, limitando las posibilidades de acceso concurrente a los datos.
Conclusión
Todo lo que es entendible es hackeable: Un sólido entendimiento de las transacciones y @Transactional es indispensable para diseñar aplicaciones empresariales robustas. Seleccionar límites y configuraciones precisas para sus transacciones es crucial para mantener la integridad de los datos, el rendimiento y la escalabilidad de sus aplicaciones. Si bien Jakarta EE simplifica significativamente las complejidades de la gestión con la anotación @Transactional, ser consciente de sus comportamientos bajo diferentes configuraciones es crucial.
CTO en GInIEm S.A, Senior Software Engineer en Design House, Sr Software Engineer en Wepa. Master en Informática empresarial y consultor de Software con más de 12 años de experiencia.
Miembro del CORE del Java User Group Nicaragua, miembro organizador de Google Developer Group Nicaragua, Flutter Nicaragua y Flutter Latinoamérica. Conferencista internacional.
Entusiasta de Java y tecnologías móviles, ha trabajado con empresas de todo el mundo en el desarrollo de soluciones comerciales y de marketing que incluyen, entre otras, desarrollo back-end, desarrollo web / escritorio front-end, inteligencia empresarial y desarrollo móvil.
Disfruta de los desafíos y proyectos que exigen dar un esfuerzo adicional para lograr resultados extraordinarios.
Con el auge de los microservicios se podria pensar que el tipo aplicaciones monolitcas, ntier, hibridas o distribuiridas estan muertas, pero no es así, estas aun tienen una gran parte del mercado y son una solucion viable, sobre todo para aplicaciones pequeñas , empresas pequeñas, startups o midlewares medianos.
¿que es una aplicación monolitica?
Una aplicacion monolitica es aquella cuyos componentes estan estrechamente ligados de tal forma que cada uno de las clases o archivos dependen uno del otro. Una aplicacion monolitica puede estar formada por 1 o cientos de archivos en una sola carpeta, y para poder hacer funcionar se requieren todo los archivos o componente, logicamente representan toda la solución, en Java, son entregados en un archivo JAR , WAR o EAR.
¿Que es Java Server Faces?
JavaServer Faces (JSF) es un framework de desarrollo de aplicaciones web Java que se utiliza para simplificar la creación de interfaces de usuario en aplicaciones web utilizando el concepto llamado: Server side render.
¿que es “Server-Side Rendering” (SSR)?
Es una técnica utilizada en el desarrollo web para generar y renderizar contenido web en el servidor antes de enviarlo al navegador del usuario. A diferencia de las aplicaciones de representación del lado del cliente (Client-Side Rendering o CSR), donde la mayor parte del procesamiento y la renderización ocurre en el navegador del cliente, en SSR, gran parte de este trabajo se realiza en el servidor.
Esto tiene la notable ventaja que los componentes visuales pueden serreutilizados , ademas permite al equipo de desarrollo centrarse en la logica de negocio y no en la apariencia, permitiendo acelerar el desarrollo y simplicar el mantenimiento.
Esta tecnologia fué un BOOM en el 2005 al 2015, actualmetne con el auge de las apliaciones distribuidas, los microservicios y los servicios rest que permitieron la proliferacion de los frameworks javascript estan cada vez en menos uso, pero son bien apreciados en muchas empresas.
Frameworks que utilizan SSR
JavaServer Faces (JSF): es un marco de desarrollo web Java que permite la creación de aplicaciones web con representación del lado del servidor.
Thymeleaf: Thymeleaf es un motor de plantillas Java que permite la creación de páginas web con representación del lado del servidor. Es especialmente popular en combinación con el marco Spring.
Spring Boot: Si está utilizando Spring Boot como su marco de desarrollo, puede implementar SSR combinando Spring Boot con Thymeleaf u otras tecnologías de plantillas.
JSP (JavaServer Pages): JSP es una tecnología de Java EE que permite la creación de páginas web dinámicas con representación del lado del servidor. Aunque se ha vuelto menos popular en comparación con otras tecnologías de plantillas, todavía se utiliza en algunas aplicaciones Java legadas.
Vaadin: Vaadin es un marco de desarrollo de aplicaciones web en Java que ofrece una interfaz de usuario rica y permite la representación del lado del servidor. Es especialmente útil para aplicaciones empresariales.
Librerias Java Server Faces
PrimeFaces: PrimeFaces es una biblioteca de componentes de código abierto muy popular para JSF. Ofrece una amplia variedad de componentes ricos y temas personalizables para mejorar la apariencia y la funcionalidad de las aplicaciones JSF.
RichFaces: RichFaces es otra biblioteca de componentes para JSF que proporciona componentes AJAX ricos y herramientas para mejorar la experiencia del usuario en aplicaciones web JSF.
BootsFaces: BootsFaces combina JSF con Bootstrap, el popular framework de diseño web, para facilitar la creación de aplicaciones web modernas y receptivas con JSF.
IceFaces: IceFaces es una biblioteca de componentes JSF que se centra en proporcionar funcionalidad AJAX avanzada para aplicaciones JSF, lo que permite una experiencia de usuario rica y dinámica.
Apache MyFaces: MyFaces es un proyecto de código abierto de la Apache Software Foundation que ofrece una implementación de JSF. Incluye un conjunto de componentes y herramientas para el desarrollo de aplicaciones JSF.
OmniFaces: OmniFaces es una biblioteca de utilidades que complementa JSF y resuelve diversos problemas comunes en el desarrollo de aplicaciones JSF. Ofrece un conjunto de extensiones útiles.
Mojarra (Oracle JSF Reference Implementation): Mojarra es la implementación de referencia de JSF proporcionada por Oracle. Aunque es una implementación estándar de JSF, se utiliza comúnmente en aplicaciones JSF.
Cuban Platform: Cuban Platform es un conjunto de herramientas y bibliotecas que extienden JSF y otros marcos de Java para el desarrollo de aplicaciones empresariales.
Se puede comenzar a crear la aplicacion desde el website de jakarta o desde el IDE. El startup de jakarta nos permite una gran configuracion inicial para nuestro proyecto.
Crear el proyecto, para esto utilizaremos IntelliJIDEa
Codigo del ejercicio:
El codigo del ejercicio lo pueden encontrar en github del grupo:
Omar es Java Senior Developer full Stack, consultor independiente. Developer Advocate, amante a la tecnología JVM con mas de 16 años de experiencia, colaborador de las distribuciones Linux: Fedora y Gentoo, ademas de otras aplicaciones libres. También es promotor y colaborador del proyecto de robótica educativa ICARO. Lider de proyecto y gestión de equipos. Conferencista, entrenador y consultor internacional. Actualmente Líder del Grupo de Usuarios Java de Nicaragua.
Puedes contratarlo para capacitaciones en tu empresa, desarrollo de software a medida, contraparte en entrega de software o consultor de seguridad.
Nosotros y terceros seleccionados utilizamos cookies o tecnologías similares con fines técnicos y, con su consentimiento, para otras finalidades (“interacciones y funcionalidades básicas”, “mejora de la experiencia”, “medición” y “segmentación y publicidad”) según se especifica en la política de cookies.
Usted es libre de otorgar, denegar o revocar su consentimiento en cualquier momento.
Configurar y más información