Ir para conteúdo

Arquivado

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

barogana

lock row

Recommended Posts

bem, as aulas começaram e com elas as encrencas, e
pra 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) autoincrement
aluno 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:

<?php
mysql_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,8
while (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 orientar
sobre como tratar esta situação.

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.