Commit 61be9bed by Adrian

Transaccion exclusiva en transferencia

parent 857ad4da
......@@ -6,12 +6,10 @@
package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Movimiento;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
......
......@@ -8,11 +8,16 @@ package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Movimiento;
import es.ujaen.dae.ujacoin.util.TipoMovimiento;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
......@@ -42,6 +47,25 @@ public class RepositorioCuentas {
em.remove(em.merge(cuenta));
}
public void transferencia(Cuenta cuentaOrigen, Cuenta cuentaDestino, float importe){
Cuenta cuentaOrigenEnlazada = em.find(Cuenta.class, cuentaOrigen.getNumero(), LockModeType.PESSIMISTIC_WRITE);
Cuenta cuentaDestinoEnlazada = em.find(Cuenta.class, cuentaDestino.getNumero(), LockModeType.PESSIMISTIC_WRITE);
cuentaOrigenEnlazada.modificarSaldo(-importe);
cuentaDestinoEnlazada.modificarSaldo(importe);
Movimiento movOrigen = new Movimiento(TipoMovimiento.TMTransferenciaEmitida, importe, LocalDateTime.now(), cuentaDestino);
Movimiento movDestino = new Movimiento(TipoMovimiento.TMTrasnferenciaRecibida, importe, LocalDateTime.now(), cuentaOrigen);
em.persist(movOrigen);
em.persist(movDestino);
cuentaOrigenEnlazada.getMovimientos().add(movOrigen);
cuentaDestinoEnlazada.getMovimientos().add(movDestino);
}
public List<Cuenta> listarCuentasPorCliente(Cliente cliente) {
em.merge(cliente);
......
......@@ -12,6 +12,7 @@ import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
......
......@@ -12,6 +12,7 @@ import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
......
......@@ -17,10 +17,12 @@ import es.ujaen.dae.ujacoin.util.TipoMovimiento;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Random;
import javax.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
......@@ -107,23 +109,11 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
}
@Transactional
@Override
public void transferencia(Cuenta cuentaOrigen, Cuenta cuentaDestino, float importe) {
repoCuentas.actualizar(cuentaOrigen);
repoCuentas.actualizar(cuentaDestino);
cuentaOrigen.modificarSaldo(-importe);
cuentaDestino.modificarSaldo(importe);
Movimiento movOrigen = new Movimiento(TipoMovimiento.TMTransferenciaEmitida, importe, LocalDateTime.now(), cuentaDestino);
Movimiento movDestino = new Movimiento(TipoMovimiento.TMTrasnferenciaRecibida, importe, LocalDateTime.now(), cuentaOrigen);
repoMovimientos.insertar(movOrigen);
repoMovimientos.insertar(movDestino);
repoCuentas.añadirMovimiento(cuentaOrigen, movOrigen);
repoCuentas.añadirMovimiento(cuentaDestino, movDestino);
repoCuentas.transferencia(cuentaOrigen, cuentaDestino, importe);
}
......@@ -215,4 +205,12 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
}
//SOLO PARA TESTS
public void asignarSaldoManual(Cuenta cuenta, float saldo){
cuenta.setSaldo(saldo);
repoCuentas.actualizar(cuenta);
}
}
......@@ -15,6 +15,7 @@ import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
......
spring.jpa.database-platform=com.springboot.sqlite.SQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform = org.hibernate.dialect.MySQL55Dialect
spring.jpa.hibernate.ddl-auto= update
spring.datasource.url = jdbc:sqlite:sqlitesampleTest.db
spring.datasource.driver-class-name = org.sqlite.JDBC
spring.datasource.url = jdbc:mysql://176.31.162.158:3306/DAE2020G9
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.username =
spring.datasource.password =
spring.datasource.username = DAE2020G9
spring.datasource.password = DAE2020G9
......@@ -119,7 +119,29 @@ public class ServicioUjaBankImplIntegrationTest {
Cuenta cuentaA = ujaBank.listaCuentas(clienteA).get(0);
Cuenta cuentaB = ujaBank.listaCuentas(clienteB).get(0);
cuentaA.setSaldo(450);
ujaBank.asignarSaldoManual(cuentaA, 450);
// ArrayList<Thread> hilos = new ArrayList<>();
//
// for (int i = 0; i < 2; i++) {
//
// Thread t = new Thread(() -> {
// ujaBank.transferencia(cuentaA, cuentaB, 125);
// });
// hilos.add(t);
// t.start();
//
// }
//
// for (Thread hilo : hilos) {
// try{
// hilo.join();
// }catch(InterruptedException e){
// throw new RuntimeException("Excepción en el join de test");
// }
// }
//
// Assertions.assertEquals(450, cuentaA.getSaldo() + cuentaB.getSaldo());
ujaBank.transferencia(cuentaA, cuentaB, 125);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment