Dúvida sobre execução de SQL

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?

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+

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?

entendi,

vc ta usando algum framework ou ta usando JDBC msm?

t+

Somente jsf com jdbc

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+

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

entendi,

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

t+

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
}

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

hibernate… :smiley:

usando jdbc

cara,

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

t+

Qual seria esse problema?

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+

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

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.

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