[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Предотвратить повторное обновление строки в таблиц
Страницы: 1, 2
Zuenf
Цитата (Медведь @ 26.06.2015 - 19:32)
А если доп.поле с временем,

в условии обновить, если текукее время больше, чем в таблице

Задача решена как бы... Нам не нужно доп.поле с временем. У нас есть поле которое обновляется, по нему и будем проверять. Второй запрос пойдет в очередь, но при этом в нем будет проверка пустое поле которое надо обновить или нет и если оно пустое то обновит.
Т.е. вот так: "UPDATE `table` SET `updateit` = 1 WHERE `id` = 8 AND `updateit` IS NULL".
Valick
Zuenf, извините меня конечно за мои слова, но осталось только насрать в БД.
Вы вообще теорию построения и правила нормализации таблиц базы данных читали?



_____________
Стимулятор ~yoomoney - 41001303250491
Zuenf
Цитата (Valick @ 26.06.2015 - 20:32)
Zuenf, извините меня конечно за мои слова, но осталось только насрать в БД.
Вы вообще теорию построения и правила нормализации таблиц базы данных читали?

Не читал. Но можно поконкретней пожалуйста, что вас не устраивает в предложенном варианте решения?
Valick
Цитата (Zuenf @ 26.06.2015 - 19:35)
что вас не устраивает в предложенном варианте решения?

отсутвие чёткого ТЗ (хуже всего когда сами не знаете чего хотите)
я же вас с самого начала просил подробнее описать задачу
возможно вы сделали логическую ошибку в самом начале, отсюда и берут начало будущие проблемы


_____________
Стимулятор ~yoomoney - 41001303250491
Zuenf
Цитата (Valick @ 26.06.2015 - 20:45)
Цитата (Zuenf @ 26.06.2015 - 19:35)
что вас не устраивает в предложенном варианте решения?

отсутвие чёткого ТЗ (хуже всего когда сами не знаете чего хотите)
я же вас с самого начала просил подробнее описать задачу
возможно вы сделали логическую ошибку в самом начале, отсюда и берут начало будущие проблемы

ТЗ было абсолютно четкое - предотвратить повторное обновление записи... Каким образом - решать вам. Никаких логических ошибок допущено не было. Даже найденное мной наипростейшее решение не противоречит изначальному ТЗ
Valick
а что если не надо ничего предотвращать?
я же вам обьясняю, что возникшая задача по предотвращению, может быть следствием логической ошибки на более ранней стадии.
ну нет так нет, дело ваше
я тут вроде как нянькой не подрабатываю

_____________
Стимулятор ~yoomoney - 41001303250491
AllesKlar
Цитата (Zuenf @ 26.06.2015 - 17:08)
Цитата (AllesKlar @ 26.06.2015 - 18:49)
Zuenf
// особо не вникая в дебаты

В таблице поле - время последнего обновления.
Данные прочитали, известно время последнего обновления.
Пытамемся обновить, если данные в таблице имеют то же время последнего обновления, как и полученные до этого данные.
Если в таблице это поле уже имеет другое значение, значит данные были обновлены другим пользователем, значит перечитываем данные сначала.

$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";
  ......


}

Ну если вы хотели ответить на мой изначальный вопрос, то к сожалению не получилось. Т.к. первый запрос 'SELECT id, feld, last_update FROM table' может вывести одновременно двум пользователь один и тот же last_update. Т.е. и один и второй получат например 26.08.2015 18:05:13. И далее последуют одинаковые действия т.к. исходные данные одинаковые. Это надо делать на уровне самой БД, т.е. если уже один запрос на обновление прошел то следующий стоящий в очереди не выполнять.

Учи матчасть.
Да, два пользователя получат одинаковый last_update
Но одновременно обновить запись невозможно, запись блокируется на момент обновления.
Итого, первый пользователь обновит данные, следовательно и last_update в таблице изменится, и второй пользователь, после разблокирвки записи, уже ничего не обновит

_____________
[продано копирайтерам]
Zuenf
Цитата (Valick @ 26.06.2015 - 21:20)
а что если не надо ничего предотвращать?
я же вам обьясняю, что возникшая задача по предотвращению, может быть следствием логической ошибки на более ранней стадии.
ну нет так нет, дело ваше
я тут вроде как нянькой не подрабатываю

Ааа вот вы о чем. Да так и есть, была логическая ошибка. Все эти проверки можно производить отдельным скриптом работающим постоянно и обновляющим данные в одно рыло. Мне время не позволяет переделывать именно сейчас т.к. завтра дедлайн.

Но задача стояла именно та, которую я поставил. Не важно допущена ошибка вне задачи или нет.

А нянчиться никто и не просит, я сказал что задача решена, все после флуд, если только вы не нашли ошибку или более простое решение.

Так можно на любую тему на форме, игнорируя входящие данные, говорить "ТЗ не четкое. Опишите подробнее вплоть до своей личной жизни. Возможно вы сделали ошибку в самом начале, выбрав программирование. Возможно вам лучше было идти биологом."
Zuenf
Цитата (AllesKlar @ 26.06.2015 - 21:27)
Цитата (Zuenf @ 26.06.2015 - 17:08)

Ну если вы хотели ответить на мой изначальный вопрос, то к сожалению не получилось. Т.к. первый запрос 'SELECT id, feld, last_update FROM table' может вывести одновременно двум пользователь один и тот же last_update. Т.е. и один и второй получат например 26.08.2015 18:05:13. И далее последуют одинаковые действия т.к. исходные данные одинаковые. Это надо делать на уровне самой БД, т.е. если уже один запрос на обновление прошел то следующий  стоящий в очереди не выполнять.

Учи матчасть.
Да, два пользователя получат одинаковый last_update
Но одновременно обновить запись невозможно, запись блокируется на момент обновления.
Итого, первый пользователь обновит данные, следовательно и last_update в таблице изменится, и второй пользователь, после разблокирвки записи, уже ничего не обновит

Да вы правы одновременно нельзя, я и не спорю. Вы слишком абстрагированный код без конкретных условий написали. Т.е. можно только гадать что скрывается под теми многоточиями. Но я понял это как-то так:


$row = getResult('SELECT id, feld, last_update FROM table');

$id = $row['id'];
$last_update = $row['last_update']; //ок хорошо мы знаем последнее обновление таблицы

//обновляем данные но не обновляем last_update??? Т.е. считай просто обновляем данные по id

mysql_query("UPDATE table SET feld = $new_data WHERE id = $id AND last_update = $last_update");//вся загвоздка в этом запросе, какое-то условие вы походу пропустили...

$is_data_update = mysql_affected_rows(); //данные успешно обновились затронув больше нуля строк по любому и следующее условие не будет истинным

if(!$is_data_update)
{
$row = getResult('SELECT id, feld, last_update FROM table');
}



Перечитал я логику описанную вами текстом. Понял. Все равно есть шанс дублирования. Запрос выполняется и возвращает данные не за одно и тоже время. Они получать одни и те же данные но небольшая разница во времени получения все равно будет. У вас расчет на то что во время задания $last_update будет одно и тоже время. В секундах почти всегда так и будет. Но миллисекунды будут отличаться. У одного например будет 05 секунд 999 миллисекунд, а у второго 06 секунд. Тогда то и обновится.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.