Для примера код:
$row = getRow("SELECT * FROM `table` WHERE `id` = 1");
if ($row['some'] == true) {
mysql_query("UPDATE `table` SET `rand` = ".rand(0, 1000)." WHERE `id` = {$row['id']}");
} else {
doSomething();
}
$row = getRow("SELECT * FROM `table` WHERE `id` = 1");
if ($row['some'] == true) {
mysql_query("UPDATE `table` SET `rand` = ".rand(0, 1000)." WHERE `id` = {$row['id']}");
} else {
doSomething();
}
$row = getRow("SELECT * FROM `table` WHERE `id` = 1 AND `rand`IS NULL "); //два пользователя выберут эту строку т.к. UPDATE еще не в очереди и соответственно обновят дважды
if ($row['some'] == true) {
mysql_query("UPDATE `table` SET `rand` = ".rand(0, 1000)." WHERE `id` = {$row['id']}");
} else {
doSomething();
}
$row = getRow("SELECT * FROM `table` WHERE `id` = 1 AND `time_end` <= NOW() AND `rand` IS NULL");
if ($row) {//время истекло значит обновляем
mysql_query("UPDATE `table` SET `rand` = ".rand(0, 1000)." WHERE `id` = 1 AND `rand` IS NULL"); //обновляем если rand еще не установлен.
} else {
doSomething();
}
Цитата (Zuenf @ 26.06.2015 - 15:50) |
"UPDATE `table` SET `rand` = ".rand(0, 1000)." WHERE `id` = 1 AND `rand` IS NULL" |
Цитата (Valick @ 26.06.2015 - 17:08) | ||
при таком запросе и предыдущий вариант будет работать после того как поле rand изменит значение с NULL на случайное, оно уже будет не NULL, следовательно все последующие запросы "в молоко" логика с `time_end` еще страшнее первоначального варианта |
Цитата (Zuenf @ 26.06.2015 - 16:20) |
Логика с time_end логичнее |
Цитата (Valick @ 26.06.2015 - 17:24) | ||
жду вашего следующего визита |
$sql = 'SELECT id, feld, last_update FROM table';
.......
$id = $row['id'];
$last_update = $row['last_update'];
......
$sql = "UPDATE table SET feld = $new_data WHERE id = $id AND last_update = $last_update";
......
// проверка, изменились ли данные, зависит от библиотеки работы с DB
if( ! $is_data_update)
{
$sql = "SELECT id, feld, last_update FROM table";
......
}
Цитата (AllesKlar @ 26.06.2015 - 18:49) |
Zuenf // особо не вникая в дебаты В таблице поле - время последнего обновления. Данные прочитали, известно время последнего обновления. Пытамемся обновить, если данные в таблице имеют то же время последнего обновления, как и полученные до этого данные. Если в таблице это поле уже имеет другое значение, значит данные были обновлены другим пользователем, значит перечитываем данные сначала. $sql = 'SELECT id, feld, last_update FROM table'; |