Anotação Transactional Spring
25/11/2020
0
Bom dia, estou enfrentando problemas em um projeto da seguinte forma.
utilizo a anotação Transactional do spring para consultar o status de uma mesa , se ela não está ocupada alterar o status para ocupado e salvar o objeto mesa, se está ocupada apenas abrir a mesa para adicionar os produtos, acontece que quado existe 2 requisições proximas da mesma mesa a consulta da segunda requisição não está retornando false enquanto não chegar ao término da primeira transação, fiz um exemplo utilizando com uma thread e dois metodos separados, quando tiro a anotação Transactional o código funciona e na segunda requisição o status da mesa retorna true(ocupada), porém tirando a anotação fico sem a possibilidade de rollback, alguém pode me ajudar ?
Segue abaixo o trecho de código.
@Service
public class TesteServiceImpl implements TesteService {
@Autowired
private MesaRepository mesaRepository;
@Override
@Transactional
public String teste() throws MaximaValidacaoException {
// Comanda nome = Comanda 14
Comanda comanda = mesaRepository.carregaPorId(1L);
if (comanda.getOcupado()) {
return "Comanda ocupada (teste).";
}
comanda.setOcupado(Boolean.TRUE);
comanda = mesaRepository.salvaComanda(comanda);
try {
Thread.sleep(5000);
} catch (InterruptedException interruptedException) {
}
return "Salvou comanda como ocupada: " + comanda.getOcupado();
}
@Override
@Transactional
public String teste1() {
Comanda comanda = mesaRepository.carregaPorId(1l);
//comanda.setOcupado(Boolean.FALSE);
//comanda.setNome("TESTE 01");
//comanda = mesaRepository.salvaComanda(comanda);
return "Comanda ocupada: " + comanda.getOcupado(); // imprime false
}
}
utilizo a anotação Transactional do spring para consultar o status de uma mesa , se ela não está ocupada alterar o status para ocupado e salvar o objeto mesa, se está ocupada apenas abrir a mesa para adicionar os produtos, acontece que quado existe 2 requisições proximas da mesma mesa a consulta da segunda requisição não está retornando false enquanto não chegar ao término da primeira transação, fiz um exemplo utilizando com uma thread e dois metodos separados, quando tiro a anotação Transactional o código funciona e na segunda requisição o status da mesa retorna true(ocupada), porém tirando a anotação fico sem a possibilidade de rollback, alguém pode me ajudar ?
Segue abaixo o trecho de código.
@Service
public class TesteServiceImpl implements TesteService {
@Autowired
private MesaRepository mesaRepository;
@Override
@Transactional
public String teste() throws MaximaValidacaoException {
// Comanda nome = Comanda 14
Comanda comanda = mesaRepository.carregaPorId(1L);
if (comanda.getOcupado()) {
return "Comanda ocupada (teste).";
}
comanda.setOcupado(Boolean.TRUE);
comanda = mesaRepository.salvaComanda(comanda);
try {
Thread.sleep(5000);
} catch (InterruptedException interruptedException) {
}
return "Salvou comanda como ocupada: " + comanda.getOcupado();
}
@Override
@Transactional
public String teste1() {
Comanda comanda = mesaRepository.carregaPorId(1l);
//comanda.setOcupado(Boolean.FALSE);
//comanda.setNome("TESTE 01");
//comanda = mesaRepository.salvaComanda(comanda);
return "Comanda ocupada: " + comanda.getOcupado(); // imprime false
}
}
Marco Christovam
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)