Dúvida sobre execução de SQL

17 respostas
Luciano_Lopes

Galera, tenho uma pagina web onde cadastro alguns itens, apos eu dar o insert no banco eu uso:

select max(codigo) as codigo from tabela

para poder pegar o ultimo codigo da tabela inserida e passar esse codigo para outros cadastros, a minha duvida é a seguinte:
Estou fazendo certo? Terei problemas quanto ao fluxo de usuário executando esse sql? Tem risco desse codigo da tabela se “perder” e acabar indo para uma tabela errada por causa do fluxo de inserts?

17 Respostas

A

cara,

vc vai ter problema sim, pense num caso, vc tem 5 usuarios simultaneos no seu sistema, o primeiro faz um cadastro, entao vc nao ta garantindo para os outros 4 usuarios q aquele id é o que vai ser inserido na pagina.

vc realmente precisa disso?

t+

Luciano_Lopes

Sim, vou te explicar a situação, tenho duas tabelas ligadas por chave estrangeira, eu preciso pegar o id da primeira e jogar na segunda(tabela de vendas e itens da venda) por isso preciso que no momento que eu der o insert ele ja pegue o ultimo id da tabela venda e guarde em um campo da pagina,entendeu?

A

entendi,

vc ta usando algum framework ou ta usando JDBC msm?

t+

Luciano_Lopes

Somente jsf com jdbc

A

cara,

se vc seguir a segiunte sequencia,

insert venda
select max
insert item venda

vai funcionar, mas se vc tiver muito acesso simultaneo, vc pode ter problema.

pq vc não utiliza Hibernate? ele resolve seu problema facilmente.

t+

Luciano_Lopes

Eu dou o insert venda, depois pego o max(codigo) e jogo dentro de um campo,apos isso os itens são inseridos pegando o codigo do campo onde esta o código. Não gosto do hibernate não,ja tentei usar mas fiquei meio perdido, gosto de fazer as coisas no braço rsrsrs

A

entendi,

entao cara, se seu sistema for ter muitooo acesso simultaneo, vc vai ter que tomar cuidadosss.

t+

A

Com jdbc também dá pra obter o ID inserido instantaneamente. Há um método de PreparedStatement que retorna a chave gerada. O que você tem que fazer é informá-la de qual(is) campo(s) da tabela contém a chave quando você manda o comando de insert. Veja esse trecho:

PreparedStatement pstm;
String strSQL;
String key[] = {"ID"};
strSQL = "insert into sua_tabela values(?,?,...)";
pstm = conexao.prepareStatement(strSQL,key);
...
//aqui vão as chamadas dos métodos de PreparedStatement de acordo com o tipo de dado para passar os valores a inserir na tabel

pstm.executeUpdate();
ResultSet rst = pstm.getGeneratedKeys();
while(rst.next()){
       rst.getInt(1);  // aqui você obtém o ID que foi gerado no insert
}
Luciano_Lopes

Pode me dar umas dicas das inserções ficarem seguras?

A

hibernate… :smiley:

Luciano_Lopes

usando jdbc

A

cara,

a ideia que o ADEMILTON é boa, o problema que vc vai ter é com o max

t+

Luciano_Lopes

Qual seria esse problema?

A

entao cara,

pense num sistema com muito acessoooo, entao chega uma requisição para esse seu metodo e ele passou para o primeiro insert, na msm hora chegou outra requisição e tbm faz o insert, na hora q primeira requisicao, for fazer select max, ele vai pegar o id da segunda requisicao, com isso seu sistema foi para o espaço.

espero q entenda

t+

Luciano_Lopes

Poxa…pior que ja to muito longe para mudar para algum framework, existe alguma maneira de simular essas inserções?

A

Reli sua primeira mensagem e pra mim ainda é claro que a solução que propus resolve seu problema. Basta fazer do mesmo jeito, eliminando o uso do select max(). Se quer garantir 100% de consistência nos seus dados, olhe para o banco e utilize os recursos que ele te oferecer. Relacionamento entre tabelas, constraints, até sequences onde for o caso.

Luciano_Lopes

Entendi, vou explorar esses recursos, qualquer coisa vou postar aqui,obrigado a todos pela ajuda,vlw

Criado 29 de outubro de 2011
Ultima resposta 30 de out. de 2011
Respostas 17
Participantes 3