выполнение пхп скрипта

Данил

Guest
выполнение пхп скрипта

В общем даже не знаю, как сформулировать вопрос, приведу лучше простую задачку в качестве примера

предположим на сервере есть скрипт plus.php

что он конкретно делает:
/////--------
проверяет в базе значение X (командой селект)

if(X == 0)

меняет в базе значение Х на 1 (командой апдэйт)

//-----------
предположим изредка значения Х в базе обнуляются (может и не этим скриптом)

по идее Х никогда не будет больше 1

но случается порой такая шняга - если два пользователя запустят скрипт на сервере практически одновременно - то он вполне может сработать два раза (и апдэйтнуть значение базы два раза, тем самым сделав Х=2)!!! - это у меня просто эксперементальный факт

Вопрос - из=за чего такое происходит? как с этим бороться, так как в моем случае это критично!?
 

Фанат

oncle terrible
Команда форума
а зачем менять прибавлением?
меняй на единицу - и все.

Но название ты придумал ,конечно, рулезное.
 

Данил

Guest
понимаешь - я написал сверхупрощенную версию скрипта , просто чтобы пояснить идею

мне важно знать почему такое в принципе происходит :о)
 

Фанат

oncle terrible
Команда форума
с удовольствием дам тебе сверхупрощенный ответ - а хрен его знает.
 

crocodile2u

http://vbolshov.org.ru
Ты по-человечески можешь объяснить, что тебе нужно сделать??? А то смотрю на этот пост - и не знаю, смеяться или ржать...
 

Данил

Guest
Panchous, ок, попробую глянуть, что это вообще такое :о)

crocodile2u

Так вот я и не знаю ,как лучше сформулировать.
по моим измышлениям это может происходить в следующих случаях
1)скрипты на выполнение не выстраиваются в очередь, а идут параллельно
2)запросы в базу выполняются не по очереди.

а что мне нужно сделать - очень просто , чтобы скрипты с концепцией как у вышеприведенного не давали сбоев типа вышеописанных :о)
 

crocodile2u

http://vbolshov.org.ru
Да ты проще скажи: что ты хочешь сделать?
Ну там: определение whoisonline, определение кол-ва юзеров, кот. просматривают страницу, определение самого факта просмотра страницы юзером..... (Это все - даже не догадки, просто, что пришло в голову - потому что, что ты пытаешься сделать - для меня лично загадка)

Короче - зачем тебе все эти апдейты???
 

Данил

Guest
valyala, спасибо, постараюсь глянуть можно ли и как это применить к моему случаю

crocodile2u,

ни один из перечисленных вариантов.
я хочу чтобы подобный баг не вылезал в сражении между игроками в игре типа "browser - based". Эти вещи не частые, но народ жалуется на двойные удары, вот я и делаю..
 

jonjonson

Guest
PHP:
// Если MySQL
function StupidTranzaction ($item_id)
{
    mysql_query('LOCK TABLES table1 WRITE');
    $result = mysql_query('SELECT var FROM table1 WHERE id = ' . $item_id);
    $row = mysql_fetch_assoc($result);
    if ($row['var'] == 0) mysql_query('UPDATE table1 SET var = 1 WHERE id = ' . $item_id);
    mysql_query('UNLOCK TABLES');
}
Хотя не понятно, как при присваивании значения (SET var = 1) может что-то сумироваться...
 

Данил

Guest
jonjonson


спасиб,

здесь такая проблема возникла -

если попытаться в таком синтаксисе делать что-нибудь с таблицами table2.....n, то ничего не получтится...

почитав мануал по этой команде я не понял толком ничего, поэтому можно плз "на пальцах"
 

Данил

Guest
я имел ввиду, что внутри этих Лок и Анлок я пытаюсь работать с другими таблицами (не table1) и это не получается..
 

jonjonson

Guest
Данил, куда проще...
1. Блокируешь таблицу на запись (свою таблицу, а table1 всеголишь для примера).
2. Проверяешь значение.
3. Изменяешь, если нужно.
4. Разблокируешь.
Финита ля комедия :)
 

Фанат

oncle terrible
Команда форума
Данил
зачем тебе работать с другими таблицами?
у тебя же проблема с одной была?
 

jonjonson

Guest
Данил, так их тоже в списочек... Или изменяй логику... Бери нужное из других таблиц и потом то что предложено.
 
Сверху