barogana 0 Denunciar post Postado Fevereiro 3, 2016 bem, as aulas começaram e com elas as encrencas, epra variar eu sou o eleito a buscar respostas.xD!Em um sistema de sorteio, todos os alunos que tiverem nota maior que 8,irão concorrer a oito ingressos de cinema.alunos:id int(11) autoincrementaluno varchar (30)turma varchar(10) etc...numerosdasorte :id int(11) autoincrement [0 a 5000]idaluno int(11) not null default 0, etc...a consideração exigida pelo professor é que haverão muitos alunos cadastrando "ao mesmo tempo",então requer uma transação para:<?phpmysql_query("START TRANSACTION");$q1 = "select id from numerosdasorte where idaluno ='0' limit 8 FOR UPDATE"; isto retornaria ids 1,2,3,4,5,6,7,8while (rs = mysql_fetch_array($q1) ){ $q2 = "update numeros set idaluno='X' WHERE id=" . $rs['id'] ; * ..}mysql_query("COMMIT");...mysql_query("ROLL BACK");...?>o que verificamos é que durante a execução do loop no ASTERISCO (*),se houver outra execução do script, no momento em que esteja, por exemplo,no segundo update (id 2), a query $q1, irá retornar os ids 3,4,5,6,7,8,9,10 como travados,já que estes IDs estão com aluno "0" no momento da leitura destes registros,e a atualização do segundo usuário, após o commit do primeiro,terá um update nos ids 3 a 10,sobrescrevendo o aluno 1 pelo aluno 2.o lock não pode ser realizado por tabela, mas sim por linha.Agradeço a quem puder orientarsobre como tratar esta situação. Compartilhar este post Link para o post Compartilhar em outros sites