Sistema de gestión transaccional que demuestra las propiedades ACID en operaciones de compra, transferencias y manejo de usuarios.
- API RESTful con endpoints para usuarios, pedidos y transferencias
- Manejo transaccional robusto con @Transactional y rollbacks automáticos
- Control de concurrencia con locks pesimistas
- Logging de errores automático en base de datos
- Validaciones de entrada con mensajes personalizados
- Manejo centralizado de excepciones
- Java 17 o superior
- Docker y Docker Compose
- Maven 3.6+
- Git
git clone <https://github.com/LuisRoft/taller-java-backend>
cd taller-java-backenddocker-compose up -dEsto creará:
- Contenedor PostgreSQL en puerto 5432
- Base de datos
taller_dbcon las tablas necesarias - Datos de prueba precargados
docker logs taller_postgres./mvnw spring-boot:runO en Windows:
mvnw.cmd spring-boot:runLa aplicación estará disponible en: http://localhost:8080
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{
"nombre": "Juan Pérez",
"email": "juan.perez@example.com"
}'curl http://localhost:8080/api/userscurl http://localhost:8080/api/users/1curl http://localhost:8080/api/productscurl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"userId": 1,
"productId": 2,
"quantity": 1
}'curl http://localhost:8080/api/orderscurl http://localhost:8080/api/orders/user/1curl -X POST http://localhost:8080/api/transfers \
-H "Content-Type: application/json" \
-d '{
"fromUserId": 1,
"toUserId": 2,
"amount": 50.00
}'./mvnw test./mvnw test -Dtest=ConcurrencyTestIntenta crear un pedido con saldo insuficiente:
curl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"userId": 5,
"productId": 1,
"quantity": 100
}'Verifica que ni el stock ni el saldo hayan cambiado.
Verifica que las constraintes de la base de datos se respeten:
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{
"nombre": "Duplicado",
"email": "juan.perez@example.com"
}'Ejecuta las pruebas de concurrencia para verificar que múltiples transacciones no interfieran entre sí.
Reinicia la aplicación y verifica que los datos persistan.
tail -f logs/application.logSELECT * FROM log_errores ORDER BY timestamp_error DESC;docker exec -it taller_postgres psql -U postgres -d taller_dbcurl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"userId": 1,
"productId": 2,
"quantity": 999
}'curl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"userId": 5,
"productId": 1,
"quantity": 1
}'curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{
"nombre": "Nuevo Usuario",
"email": "juan.perez@example.com"
}'src/
├── main/
│ ├── java/com/luisdev/taller/
│ │ ├── dto/ # Objetos de transferencia de datos
│ │ ├── entity/ # Entidades JPA
│ │ ├── exception/ # Excepciones personalizadas
│ │ ├── repository/ # Repositorios JPA
│ │ ├── service/ # Lógica de negocio
│ │ └── TallerController.java
│ └── resources/
│ └── application.properties
└── test/
└── java/com/luisdev/taller/
└── ConcurrencyTest.java
export DB_HOST=localhost
export DB_PORT=5432
export DB_NAME=taller_db
export DB_USER=postgres
export DB_PASSWORD=passworddefault: Configuración para desarrollo con PostgreSQLtest: Configuración para pruebas con H2 en memoria
# Verificar que el contenedor esté corriendo
docker ps
# Revisar logs del contenedor
docker logs taller_postgres
# Reiniciar el contenedor
docker-compose restart postgres# Limpiar y recompilar
./mvnw clean installSi el puerto 8080 está ocupado, cambia en application.properties:
server.port=8081El sistema incluye logging detallado de transacciones. Para análisis de rendimiento, consulta:
- Tiempo de ejecución de queries en logs
- Número de rollbacks en
log_errores - Estadísticas de pool de conexiones
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto es con fines educativos para demostrar manejo transaccional en Spring Boot.
¡El sistema está listo para demostrar las propiedades ACID en acción! 🎉