Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

webruno

É seguro usar o mysql_insert_id() para recuperar o ultimo ID?

Recommended Posts

E aí galera, beleza?Gostaria de saber se é seguro usar o mysql_insert_id() para recuperar o último ID logo após um insert, sendo que o servidor recebe a toda hora insert de outros usuários. Não é perigoso um insert ser feito ao mesmo tempo e o mysql_insert_id pegar o id da outra requisição?O MySQL gerencia as requisições pra que isso não aconteça?Obrigado desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

não sei c é seguro pois nunca utilizeiprefiro utilizar meu select MAX(cod) INTO ultimo_cod from tabela=D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehe, se o mysql_insert_id não for seguro, esse código que você postou tambem não será... pois pode haver processos ao mesmo tempo, e o seu SELECT pegar o codigo de outro insert...Mas valeu, se alguem mais puder dar uma luz eu agradeço!Valeu galera, Bruno

Compartilhar este post


Link para o post
Compartilhar em outros sites

não c meu sistema não tem trocentas conexoes e ele da lock na hr da inserção eu uso esse codigo dentro da minha SP de inserção ;)ta la no manual do php:Nota: O valor da função SQL do MySQL LAST_INSERT_ID() sempre contém o mais recente valor AUTO_INCREMENT gerado, e não é reiniciado entre as query.LAST_INSERT_ID([expr]) Returns the last automatically generated value that was inserted into an AUTO_INCREMENT column. See section 8.4.3.126 mysql_insert_id(). mysql> SELECT LAST_INSERT_ID(); -> 195 The last ID that was generated is maintained in the server on a per-connection basis. It will not be changed by another client. It will not even be changed if you update another AUTO_INCREMENT column with a non-magic value (that is, a value that is not NULL and not 0). If you insert many rows at the same time with an insert statement, LAST_INSERT_ID() returns the value for the first inserted row. The reason for this is to make it possible to easily reproduce the same INSERT statement against some other server. If expr is given as an argument to LAST_INSERT_ID(), then the value of the argument is returned by the function, and is set as the next value to be returned by LAST_INSERT_ID(). This can be used to simulate sequences.ou seja, é sempre bom você fazer isso NO BANCO DE DADOS!!! e não na linguagem ;D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando desenvolvo um sistema em todas as tabela insiro um código de usuário que alem de resolver este problema registra quem fez a inclusão então e só fazer: select max(campo) from tabela where codigo_usuario=999

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu utilizo o LAST_INSERT_ID() na aplicação.Esta aplicação roda em pelo menos 28 máquinas (não é web).P/ resolver utilizamos transações, ex em VB:

Dim RsTeste as Adodb.RecordsetBanco.BeginTransBanco.execute "INSERT INTO tabela values (aaaaa)"'se executar algo do tiposet rsTeste = Banco.execute("SELECT CODIGO FROM tabela WHERE CODIGO = LAST_INSERT_ID()")msgbox RsTeste.Fields("CODIGO")'Onde CODIGO é o nome do campo auto-incrementoBanco.CommitTrans

Então executando o LAST_INSERT_ID() antes de finalizar a transação retorna o código correto mesmo que em outro computador esteja inserindo registro ao mesmo tempo.Esta aplicação esta funcionando há uns 4 anos e até hoje não houve problemas em relação a isto.E detalhe:

SELECT CODIGO FROM tabela WHERE CODIGO = LAST_INSERT_ID()

retorna mais rápido que:

SELECT LAST_INSERT_ID() FROM tabela

Faça um teste em uma tabela com 400.000 registros p/ ver a enorme diferença.Se você utiliza transação na aplicação não teria problemas neste caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá cassitos, Mas como isto funciona???, eu preciso de um usuário diferente no mysql para cada máquina ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você utiliza transação na aplicação não teria problemas neste caso.

Me corrija se eu estiver errado... ja tive que ir atrás de transações pois num servidor em que estava hospedados meu BD estava dando sobrecarga por uma aplicação feita em VB (não por mim). Então nas minhas pesquisas sobre transaction aprendi que não adianta colocar estes comandos no php quando faz conexão com tabelas MyISAM, apenas funciona em InnoDB (que é em torno de 3x mais lenta, porém preza pela segurança e não velocidade).

ou seja, é sempre bom você fazer isso NO BANCO DE DADOS!!! e não na linguagem ;D

Suissa, não entendi o que você quis dizer com isso mano.

não c meu sistema não tem trocentas conexoes e ele da lock na hr da inserção

Suissa, você pode me explicar como você faz o lock na hora da inserção em PHP?Valeu galera, obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá cassitos, Mas como isto funciona???, eu preciso de um usuário diferente no mysql para cada máquina ???

Não, quer dizer, pelo menos na aplicação temos apenas 1 usuário no mysql.O sistema utiliza apenas 1 usuário p/ conectar-se, a administração de acesso ao sistema é por uma tabela de usuários do banco da aplicação.

Me corrija se eu estiver errado... ja tive que ir atrás de transações pois num servidor em que estava hospedados meu BD estava dando sobrecarga por uma aplicação feita em VB (não por mim). Então nas minhas pesquisas sobre transaction aprendi que não adianta colocar estes comandos no php quando faz conexão com tabelas MyISAM, apenas funciona em InnoDB (que é em torno de 3x mais lenta, porém preza pela segurança e não velocidade).

Sim, funciona em InnoDB, MyISAM até o momento parece que não funciona bem com transação.Neste caso é interessante fazer uma aplicação de testes e simular este tipo de situação em MyISAM, p/ saber se utilizar o MAX ou LAST_INSERT_ID().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom não tenho muito conhecimento de programação então não lembrava das transações na aplicação, pq sempre lembro das transações no bancoUma transação é uma unidade atômica de processamento que inclui uma ou mais operações de leitura ou escrita no banco de dados. Algumas características de transações:- Atomicidade: como principal característica sua execução tem que ser integral, ou nenhuma parte deve ser executada, ou seja, você utiliza transação quando determinada ação envolve atualização de mais de uma tabela do banco.E para garantir que todas as atualizações sejam feitas utiliza-se transação. Se uma ação pode ser separada em ações menores, então temos duas (ou mais) transações, ou seja, se uma ou mais ações podem falhar sem deixar o banco de dados em estado inconsistente, estas ações não devem ser parte da mesma transação.- Consistência: A execução de uma transação deve levar ao banco de dados de um estado consistente a outro também consistente. Uma transação é consistente se não violar a integridade do banco de dados. Se a transação tiver êxito ou falhar, ela deve deixar o banco de dados em um estado consistente.Se uma transação falhar, ela precisa desfazer todas as alterações temporárias e deixar o banco de dados no estado em que ele estava antes que a transação iniciou.- Isolamento: Uma transação não deve tornar suas atualizações visíveis a outras transações antes do seu fim. Uma transação que debita uma conta e credita outra deve ser totalmente transparente. Quando isso é feito, a transação precisa atualizar o banco de dados de uma só vez. Por exemplo, se um usuário solicitar o saldo de uma conta e a mesma está sofrendo uma transação o banco de dados só deve retornar o valor do saldo depois que completar a atualização, assim dessa forma durante a transação algumas linha são bloqueadas.- Durabilidade: Após o termino de uma transação, suas atualizações não podem ser perdidas por causa de falhas futuras. Se todas as ações forem realizadas com sucesso isso não significa sucesso na transação, pois precisa gravar os dados de volta ao disco. Caso ocorra uma falha no disco a transação não é válida. Então antes que uma transação seja completada ela deve verificar se as alterações foram gravadas com sucesso antes de terminar. fonte: http://www.linhadecodigo.com.br/artigos.asp?id_ac=514realmente c na aplicação ele consegue garantir varios comandos em uma soh transação esse é o meio http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Eu utilizo o LAST_INSERT_ID() na aplicação.Esta aplicação roda em pelo menos 28 máquinas (não é web).P/ resolver utilizamos transações, ex em VB:

Dim RsTeste as Adodb.RecordsetBanco.BeginTransBanco.execute "INSERT INTO tabela values (aaaaa)"'se executar algo do tiposet rsTeste = Banco.execute("SELECT CODIGO FROM tabela WHERE CODIGO = LAST_INSERT_ID()")msgbox RsTeste.Fields("CODIGO")'Onde CODIGO é o nome do campo auto-incrementoBanco.CommitTrans

Então executando o LAST_INSERT_ID() antes de finalizar a transação retorna o código correto mesmo que em outro computador esteja inserindo registro ao mesmo tempo.Esta aplicação esta funcionando há uns 4 anos e até hoje não houve problemas em relação a isto.E detalhe:

SELECT CODIGO FROM tabela WHERE CODIGO = LAST_INSERT_ID()

retorna mais rápido que:

SELECT LAST_INSERT_ID() FROM tabela

Faça um teste em uma tabela com 400.000 registros p/ ver a enorme diferença.Se você utiliza transação na aplicação não teria problemas neste caso.
isso acontece pq a procura é feita primeiramente pelo índice q eh o codigo, logo mais rápido que uam consulta direta na tabela :rolleyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Afinal, qual é a melhor solução para evitar que dois usuários insiram o mesmo valor ao mesmo tempo ????Temos duas tabelas, solicitacao e itens_solicitacao. A tabela itens_solicitacao tem como chaves primárias o id da tabela solicitacao e o numero do item. Um usuário insere um solicitação com id 25, logo na tabela itens_solicitacao, os itens da solicitacao 25 ficarão com o id igual a 25 e o iten da solicitacao. Um usuário pode pedir uma solicitação de um cetor específico, sendo que qualquer usuário daquele setor pode inserir itens nesta mesma solicitação. Como proceder para que não aconteçam erros durante o uso do sistema, evitando que vários usuários insiram um mesmo item ao mesmo tempo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

meu filho por favor leia o meu post acima e entre no link que passeips rapidinho: o banco não deixa inserir um item AO MESMO TEMPO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros,a função mysql_insert_id() funciona sob uma sessão de usuário, não sendo possível recuperar outros id inseridos, mesmo sendo ao mesmo tempo.Quando você insere um registro, cria-se uma sessão vinculado a este registro em particular, mesmo que outro registro seja inserido no mesmo momento, nada ira ocorrer, pois ele não pertence a esta sessão.Abraços,Léo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros,a função mysql_insert_id() funciona sob uma sessão de usuário, não sendo possível recuperar outros id inseridos, mesmo sendo ao mesmo tempo.Quando você insere um registro, cria-se uma sessão vinculado a este registro em particular, mesmo que outro registro seja inserido no mesmo momento, nada ira ocorrer, pois ele não pertence a esta sessão.Abraços,Léo

Bingo! Falou tudo! ... ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.