1
resposta

Desafio da Persistência: Controle de Transações AJAX - Não Funciona!

Saudações, comunidade!

Estou enfrentando um verdadeiro desafio de persistência e precisava de um pouco de ajuda. Estou lidando com um caso complicado de controle de transações usando AJAX. Já estou aplicando o controle de transações conforme aprendi no curso, mas parece que algo não está funcionando conforme esperado.

Explicando melhor, tenho um sistema AJAX que se comunica com o backend e executa uma série de operações de cadastro, que são compostas por várias queries. No entanto, se o usuário atualizar a página logo após clicar no botão que aciona o AJAX, parece que algumas informações podem ser salvas no banco de dados de forma incompleta.

Alguém já se deparou com essa situação antes? Ou teria alguma sugestão adicional para garantir que minhas transações sejam tratadas corretamente?

Códigos abaixo:

<?php
    ob_start();
    session_start();

  //TODOS OS REQUIRES NECESSÁRIOS ESTÃO AQUI

    //Objetos essenciais da página
    $sistema = new Sistema();
    $sistema->verificarSessao();
    $CD_Sessao = $sistema->retornarSessao('logado');
    //Cria usuário
    $usuario = new Usuario($CD_Sessao);
    $dados = $usuario->buscarDados();
    $usuario->verificarBloqueio();
    //Retornar o nível sistemico do usário logado em questão
    $nivelSistemicoUsuario = $usuario->retornarNivel();
    //Verifica acessibilidade do usuário pela página

    // Lê o corpo da solicitação JSON
    $jsonData = file_get_contents("php://input");
 
    // Decodifique o JSON para obter um array associativo
    $dados = json_decode($jsonData, true);


    try{
        $conexao->beginTransaction();
    
        // Itere sobre o array para obter objetos em PHP
        foreach ($dados as $item) {
            $codigoSaida = $item['codigoSaida'];
            $codigoProduto = $item['codigoProduto'];
            $nomeProduto = $item['nomeProduto'];
            $quantProdutoSaida = $item['quantProdutoSaida'];

            // Agora você pode usar essas variáveis para criar objetos ou fazer o que quiser
            // Por exemplo, criar um objeto stdClass para cada item
            $objeto = new Produto($codigoProduto, $nomeProduto, "descricao", 0, 0, 0, 0);

            // Faça algo com o objeto, por exemplo, adicioná-lo a um array de objetos
            $objetos[] = $objeto;

            //Gera o balanco como entrada no banco de dados (tabela balanço)
            $objeto->gerarBalaco($quantProdutoSaida, $usuario->retornarCPF(), "ENTRADA_.{$codigoSaida}");

            // Instanciar e chamar o método para cadastrar cada objeto no banco de dados (tabela produtos)
            $objeto->registrarEntradaDoProduto($codigoSaida, $quantProdutoSaida);

            //Executa a operação de subtração do produto em questão e salva a quantia apenas no atributo de quantidade em estoque
            $objeto->somar($quantProdutoSaida);

        }

        $conexao->commit();

    }catch(PDOException $e){
        
        $conexao->rollBack();
    }

//FIM DO PROGRAMA
exit;

Agradeço imensamente pela ajuda!

1 resposta

Olá! Entendo que você está tendo um problema com o controle de transações usando AJAX. Aqui estão algumas sugestões que podem ajudar:

  1. Verifique a lógica de transação: Certifique-se de que a lógica para iniciar, confirmar e reverter uma transação está correta. No seu código, parece que você está começando uma transação com $conexao->beginTransaction(); e confirmando a transação com $conexao->commit(); se não houver erros. Se ocorrer um erro, você está revertendo a transação com $conexao->rollBack();. Isso parece correto.
  2. Verifique o tratamento de erros: Certifique-se de que você está lidando corretamente com os erros. No seu código, você está capturando exceções do tipo PDOException e revertendo a transação se ocorrer um erro. Isso parece correto.
  3. Verifique a lógica do AJAX: Certifique-se de que a lógica do AJAX está correta. Se o usuário atualizar a página logo após acionar o AJAX, isso pode interromper a solicitação AJAX e causar problemas. Você pode tentar desabilitar o botão que aciona o AJAX até que a solicitação seja concluída para evitar isso.
  4. Verifique o tempo limite da solicitação: Se a solicitação AJAX estiver demorando muito para ser concluída, isso pode causar problemas. Você pode tentar aumentar o tempo limite da solicitação ou otimizar seu código para que a solicitação seja concluída mais rapidamente.

Espero que isso ajude! Se você tiver mais perguntas, fique à vontade para perguntar.

https://cursos.alura.com.br/forum/topico-desafio-da-persistencia-controle-de-transacoes-ajax-nao-funciona-356741