@khodos_dmitry

PHP-скрипты выполняются последовательно?

Допустим данные в таблице удаляются и записываются новые. Может быть так, что пользователь зайдет на страницу и запросит данные, которые удалились, но еще не обновились? И как этого избежать?
  • Вопрос задан
  • 256 просмотров
Решения вопроса 1
shaks
@shaks
Используйте транзакции баз данных. Они как раз для подобных случаев и созданы.
Логика примерно следующая
псевдокод:
<транзакция>
- удаляем что-то
- апдейтим что-то гдето
- записываем что-то кудато
если всё ок:
     -- commit, все запросы в бд ушли, но не выполнились, команда commit выполняет их все сразу. 
иначе
    -- rollback - откат всех запросов в бд, что выполнены в блоке транзакции. 
</транзакция>
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
OnYourLips
@OnYourLips
Может.

И как этого избежать?
Либо использовать семафоры или другие ipc-средства, либо писать логику так, чтобы такое отсутсвие данных не мешало, либо версионировать данные и показывать последние завершенные.

Upd: транзакции.
Ответ написан
Комментировать
tomnolane
@tomnolane
профессиональный разработчик
php выполняется последовательно (если вы конечно, не используете дополнительные потоки).
Чтобы произошло то, что вы написали - нужно, чтобы вызов функции удаления (в php) выполнилась ДО функции получения данных (где ключ, по которому вы получаете данные один и тот же при использовании запроса на удаление и последующего вызова). Пример: удаляете запись под id=5. И сразу хотите получить запись под этим же id. Тогда в этом случае - данные просто не подгрузятся в html разметку.

Если пользователь получил какие-то данные с БД, и во время этого какие-то записи были удалены - у него(пользователя) ничего не изменится, пока он не перезагрузит/перезайдёт на эту же страницу.

И как этого избежать?

удалять/получать записи не по "фиксированному" ключу, а по ключу, который вы получаете напрямую с БД (как правило это id, который должен быть "уникальным", т.е. иметь сво-во автоинкриминтации)
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
0. Добавляем к данным статус "опубликовано/не опубликовано/удалено"

1. Добавляем новые данные со статусом "не опубликовано"
Если в это время произойдет выборка пользователь будет продолжать видеть старые данные.

2. Одним запросом меняем статус у старых данных на "удаленно" а у новых на "опубликовано"
Если в это время произойдет выборка пользователь получит только новые данные.

3. Можно спокойно удалить старые.

Или версии ввести, как посоветовал OnYourLips
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы