marsolim 110 Denunciar post Postado Março 9, 2015 já pesquisei e li muita coisa sobre o mysql mas ficou uma dúvida que me persegue a tempos. eu sei que posso definir um campo primary key ou unique ou auto increment para que ele não seja duplicado e sei também que isso vou falar tem possibilidades muito remotas de acontecer mas vamos supor que um dia aconteça. eu crio um site aonde as pessoas se cadastram. suponhamos que assim que eu divulgo ele nas redes sociais e outros sites, blogs etc venha um grande número de pessoas se cadastrar. vamos supor umas 800 pessoas e 50 delas clicando no botão de confirmar cadastro exatamente no mesmo instante. como o mysql lida com isso para garantir que campos únicos não se dupliquem como por exemplo um auto increment que seria a id nesse caso? pois se 50 pessoas clicaram em confirmar exatamente no mesmo instante se supõe que todos eles enxergarão o mesmo max number nesse campo. teria o mysql uma forma de colocar em fila quando recebe mais de um registro ao mesmo tempo para poder lidar com isso? outra situação. vamos supor que 5 desses usuários sejam fã de homem aranha e pensam em usar spiderman como nome de usuário. se o nome ainda não existe no banco de dados e todos clicaram ao mesmo tempo em confirmar, isso não geraria uma confusão no banco de dados? bem caso não se possa chegar a uma conclusão quanto a isso como se resolveria tal fato? a princípio pensei em duas possíveis saídas. para o caso da id como auto increment pensei em trocar para um campo normal e usar o ip do usuário junto com a data e a hora do cadastro para formar a id. algo como 00025501120150309131427(255.000.011_2015-03-09_13-14-27). já para o caso de usuário pensei em validar em duas etapas. primeiro checa por php se já existe o usuário. se não existe cadastra. em seguida verifica os cadastros dos últimos 30 segundos por exemplo para ver se continua tendo só o que foi cadastrado para esse usuário ou se aparecem outros e aí toma outra decisão como por exemplo enviar uma mensagem para o usuário escolher outro nome e deixar o registro bloqueado até que o nome seja mudado e seja único. o que vocês podem dizer sobre isso? agradeço pela atenção. Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Março 9, 2015 Movendo para a área correta, MySQL. Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Março 9, 2015 Quando as 50 pessoas clicarem ao mesmo tempo no cadastrar, o MySQL vai receber uma fila de queries, pois todas envolvem a mesma tabela, então será executada uma após a outra. Para o caso dos usuários que se cadastraram como "spiderman" acontece a mesma coisa, mesmo que todos eles tenham visto que este nome de usuário estava disponível, somente um poderá ser este usuário único, para os demais, ocorrerá um erro. Você pode fazer um teste, rodando um INSERT 50 vezes com alguma estrutura de repetição. 50 não, mais! Umas 1000! Mais! 5000! Eu disse mais! 1000000! Faça os testes, seja criativo. ;D Compartilhar este post Link para o post Compartilhar em outros sites
marsolim 110 Denunciar post Postado Março 9, 2015 agradeço a todos pela atenção. lokaodomau até pensei em fazer esse tipo de teste mas um laço por mais rápido que seja executado ainda assim os dados são enviados um após outro e não exatamente no mesmo instante. ainda ontem fiz um teste aqui em um laço for para avaliar qual era mais rápido se é o pré incremento (++$i) ou o pós incremento ($i++). fiz um teste de 0 a 1 bilhão aonde em todos eles o pré incremento foi cerca de 20% mais rápido. bem ele demorou em média 45 segundos para ser executado. isso significa que os dados não seriam enviados exatamente no mesmo instante. claro que 1000 para 1000000000 é uma distância muito grande mas mesmo assim acho que não seria 100% confiável. mas sendo como tu disse que o mysql mesmo coloca os registros em fila e trata eles um a um então fica sanada a dúvida. grato mais uma vez a todos. Compartilhar este post Link para o post Compartilhar em outros sites