Consulta sql..retorna registro posterior em vez do corrente.....mysql

7 respostas
F

galera, estou com um processo aqui que só ocorre “erro” as vezes…

Tenho a seguinte linha de consulta:

Select e.id_estado, e.unidfed, p.total_final, p.idpar, b.nosso_numero, p.entrega_nro, p.data_inicio, ADDDATE(p.data_inicio,5),c.codigo, p.id,p.id_cliente, c.nome, p.total_com_frete, p.entrega_endereco, p.entrega_cep, p.entrega_cidade, p.entrega_id_estado, p.entrega_id_estado  FROM boletos b, cliente c INNER JOIN pedido p ON p.id_cliente = c.codigo INNER JOIN estado e ON e.id_estado = p.entrega_id_estado ORDER BY p.id DESC LIMIT 1

Acontece que nas simulacoes, se tiver duas compras simultaneas ele se perde na hora de pegar o numero do pedido…por exemplo:

meu pedido é nº 15 e tem outra compra ao mesmo tempo com n. pedido 16
Na hora de gravar o numero do pedido, as vezes ocorre dele jogar o penultimo no ultimo…:confused:

Alguem tem alguma ideia?

Pq aparentemente ele esta funcionando normal…

obrigado pela ajuda

7 Respostas

peczenyj

Sem ver como vc esta fazendo só posso suspeitar que em algum momento vc esta fazendo reuso de alguma variavel (de instância) ou vc tem algum problema de concorrência (ainda mais se quem acessa o banco for um singleton).

Acredito piamente que um desenvolvimento voltado à alguma % de testes poderia elucidar estes pontos. Por exemplo, se vc tem

XXX -> Classe Negocio -> DAO -> JDBC/Hibernate/Etc -> Banco de Dados

Nos testes eu verificaria se as classes de Negocio usam o DAO da forma esperada (inserindo um mock do DAO e criando Expectations). E nos testes do DAO eu verificaria se ele usa o JDBC/Hibernate/Etc da forma certa (da mesma forma até). Um segundo ciclo de testes eu faria com o DAO acessando o banco de verdade, limpando o banco sempre que necessário, acho que DBUnit seria o mais indicado, talvez. Sugiro o seguinte: investigue o bug e tente criar testes que confirmem o mesmo, assim se ele for reintroduzido um dia, sem querer, vc possa detectar. Se alguem disse que desenvolver com testes consome tempo, pense em quanto tempo vc perdeu e ainda vai perder com este bug. É bom perder tempo com algo diferente.

Por exemplo, relendo o seu relato acho que vc criou uma consulta aonde vc espera um dado cenario, porém se tem outro usuario fazendo outra coisa isso atrapalha. Seu SQL é grande demais para eu dar uma olhada e achar o problema mas eu partiria desse ponto.

F

Entendi…

Cara valeu pela dica…vou dar uma alisada como voce disse…

abs

Fabio

vhmolinar

Ola,

o nome do seu tópico é 'consulasql…retorna registro posterior em vez do corrente…'
o que que você chama de corrente?
Corrente é o mais atual?

Porque se for sua consulta ta certa uma vez que você ordena decrescente e pega a primeira tupla:

De acordo com o que você escreveu ta certo cara , não tem falha você que ta se confundindo.

peczenyj

É verdade, esse trecho tava na cara (e no final).

Se alguem adiciona algo depois de vc, vc pega o dado desse cara. Mas se vc sabe o id que deve ser processado informe-o no select. Vc nunca sabe o que pode acontecer no banco.

F

Entao cara…

Esta deste jeito mesmo . Acontece que eu fiz duas compras simultaneas(dois navegaores abertos) de alguma forma, quando voce faz a consulta para pegar o atual(corrente ou ultimo) de alguma forma se alguem começa uma compra simultanea com voce, as vezes aconteceu dele trocar o valor da compra(um pelo outro)…

Por exemplo, voce comecou a comprar…e outra pessoa tambem só que uns segundos depois, na teoria o registro dela é o ultimo…

MAS entao, quando vc fechou sua compra ele pega o dado do ultimo, que seria a pessoal que comecou comprar depois…creio que é isso que acontece…

peczenyj:
É verdade, esse trecho tava na cara (e no final).

Se alguem adiciona algo depois de vc, vc pega o dado desse cara. Mas se vc sabe o id que deve ser processado informe-o no select. Vc nunca sabe o que pode acontecer no banco.

vhmolinar

Tenta mudar o meio de acessar esse dado, pois isso é problema de arquitetura, assim como peczenyj disse

Nos diga a real necessidade de ter esses valores que talvez agente possa te sugerir uma solução melhor sem ter problemas de concorrencia.

Abraços

F

Galera, valeu pela ajuda mesmo !

Os dados eram necesssarios pois envolvia 3 tabelas…

Eu resolvi, subtituindo o ORDER BY…em vez de pelo id da compa eu fiz pela data(pois o formato dela esta com horas…minutos e segundos)

Fiz inumeros testes, ate agora blz…vamos ver…

De qualquer forma…obrigado vhmolinar e tambem ao peczenyj pela ajuda…

abs

Criado 4 de junho de 2010
Ultima resposta 7 de jun. de 2010
Respostas 7
Participantes 3