Одновременный доступ к базе нескольких скриптов

yuriykaskoff

Новичок
Одновременный доступ к базе нескольких скриптов

Добрый день уважаемые знатоки. Подскажите, как решить такой вопрос. Есть база, в ней таблица примерно такая
Id name status
1 Вася 1
2 Петя 1
3 Вася 1
4 Вася 1
Через планировщик в windows7 и php я запускаю выполнение скрипта php и выходит типо cron. Делает скрипт например вот что. Во всех name заменяет букву “a” на “o”. В запросе указываю, что бы выбирал одну запись пока status = 1 и заменял на 0 если уже обратился. По идее следующие скрипты уже не должны обращаться к этой записи. Когда я запускаю один скрипт то все отлично, а когда несколько (одновременно) то например два скрипта могу обратиться к одной и той же записи и сначала один поищет “a” и если найдет то заменит, а потом второй в той же записи ищет. Нужно как то сделать, что бы если один скрипт уже обратился к записи, то все следующие уже не обращались к ней.
Запрос в скрипте примерно такой $qw="SELECT * FROM users WHERE flag=1 LIMIT 1";. И сразу же после этого запроса делаю вот этот $qu="UPDATE users SET flag=0 WHERE name='".$adr."'";, здесь поля и таблица отличаются от тех что я нарисовал но это не важно, что бы другие не могли повторять чтение выбранной уже записи. Но увы иногда два скрипта или более читаю одну и ту же запись. Как сделать что бы если один уже выбрал запись то остальные никак ее не могли выбрать?
 

yuriykaskoff

Новичок
решил так

for($i=$count;$i>0;){
mysql_query("LOCK TABLES users WRITE") or die("error 4");
$qw="SELECT * FROM users WHERE flag=1 LIMIT 1"; echo "++++++++++";
$rec=mysql_query($qw);
if(mysql_num_rows($rec)>0){
while($row=mysql_fetch_array($rec)){
$adr=$row['name'];
$qu="UPDATE users SET flag=0 WHERE name='".$adr."'";
mysql_query($qu);
mysql_query("UNLOCK TABLES") or die("error 5");

Вроде все работает, хотя и последовательно но не важно, зато так как надо

-~{}~ 14.08.10 15:30:

Вставил
mysql_query("LOCK TABLES users WRITE") or die("error 4");
mysql_query("UNLOCK TABLES") or die("error 5");
 

Ragazzo

TDD interested
Смотрится конечно как костыль, но в этом случае главное что работает :)
 

yuriykaskoff

Новичок
fixxxer скажите пожалуйста насколько плохо то что я использовал
ето

mysql_query("LOCK TABLES users WRITE") or die("error 4");
mysql_query("UNLOCK TABLES") or die("error 5");

а не

SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;

?
 

fixxxer

К.О.
Партнер клуба
разница в том что блокируется вся таблица, если это не критично то ничем не плохо.
 

Ragazzo

TDD interested
Вурдалак
я хотел сказать, что транзакции могут блочить не всю таблицу , а только отдельные записи с которыми они работают
 

yuriykaskoff

Новичок
Всем спасибо, переделал на

begin
select .. for update
update
commit

все хорошо работает.

Подскажите еще ответ на вопрос.
Как сделать быструю проверку в коде php существования записи и если такая есть или нет выполнить какие-нить действия?
 
Сверху