Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite galera,
há uma semana comecei a estudar PHP, estou vindo do ASP clássico. Quero sair do procedural e ir para a orientação a objetos. Então comecei a fazer um sistema de artigos, para ir treinando a sintaxe.
Vamos ao exemplo
No cadastro do artigo existe um campo para adicionar tags(palavras chaves), onde o usuário separa as palavras com ;(ponto e vírgula).
Na hora do cadastro o procedimento seria assim:
1º- INSERT NO BANCO O ARTIGO (na tabela artigo);
2º- SELECT O ÚLTIMO ARTIGO INCLUÍDO (select com order by id desc);
3º- FAÇO UM SPLIT NAS PALAVRAS CHAVES;
4º- INSERT NA TABELA TAGS;
Minha dúvida é a seguinte. Supondo que meu sistema tenha 1 milhão de usuário e 10 mil deles estão adicionando um artigo no mesmo milésimo de segundos. Na hora de fazer o select no último artigo incluído(passo 2) o usuário pode selecionar um artigo que não foi ele que incluiu.
Não sei se o servidor web ou o BD já trata isso, mas existe alguma forma de reservar esse id antes de inserir o artigo, para evitar esse erro?
>
Uma alternativa para isso era você criar uma hash única, e procurasse apartir dela ao invés do id. Essa informação você teria antes de salvar e consequentemente poderia utilizar ela para buscar o artigo epegar o id.
Bom dia Gedson,
como eu faria isso?
Gero uma hash md5? Mas seria a partir de que valor?
Desnecessário tudo isso... Basta retornar o ID do último artigo inserido com a função last_insert_id se estiver usando MySQL.
Com outro SGBD, creio que seja mais fácil realizar uma transação...
Você também pode reservar o ID para o registro. No postgre, por exemplo, existe a função nextval. Ela reserva e retorna um ID para uso em uma tabela, é bem seguro.
O MySQL não possui isso, mas existe esse artigo explicando como pode-se implementar a função.
Emulating nextval() function to get sequence in MySQL
Eu sou um tanto pé atrás com a função last_insert_id(), na época mysql_insert_id(), do php. Durante anos e até um tempo atrás diziam para não utilizarem ela por problemas de condição de corrida. Agora falam que não existe esse problema.
Com a PDO, entretanto, o contexto em que a query é executada, garante a integridade do método PDO::lastInsertId(). Como, quando eu comecei a utilizar a PDO, já possuía o nextval implementado, sempre o utilizei.
>
Desnecessário tudo isso... Basta retornar o ID do último artigo inserido com a função last_insert_id se estiver usando MySQL.
Com outro SGBD, creio que seja mais fácil realizar uma transação...
entao henrique, dessa forma tbm pode ocorrer de dois usuarios pegarem o mesmo id. So se a requisao da pagina ocorresse em fila.
entao henrique, dessa forma tbm pode ocorrer de dois usuarios pegarem o mesmo id. So se a requisao da pagina ocorresse em fila.
O registro é feito por conexão, ou seja, para cada thread que vai atender uma requisição ao banco, o valor é salvo em separado. Não sei detalhes de implementação, mas não tem nenhum problema de race condition...
Edit: Detalhe que se você abre a conexão e fecha em cada query, isso não vai funcionar, além de ser um grande desperdício de tempo útil de processamento...
Dá uma olhada nesse link, ele tem a solução para seu problema! ;)
https://groups.google.com/forum/?hl=pt&fromgroups=#!topic/listaphp/yFDLC7ZjMFc
Uma alternativa para isso era você criar uma hash única, e procurasse apartir dela ao invés do id. Essa informação você teria antes de salvar e consequentemente poderia utilizar ela para buscar o artigo epegar o id.