Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Программирование, одновременное выполнение кода

#php


Здравствуйте, у меня немного странный вопрос, который похож на паранойю, но так и есть.

Допустим в php коде есть элементарная проверка:

if(!$db->get(SELECT выбираем запись из таблицы)) {
//и если записи нет то делаем внос
$db->query(INSERT);
}


То есть при таких условиях, невозможно иметь две записи одновременно. 

Не обессудьте, но что если произойдет редчайшее явление когда две звезды  окажутся
на параллельном уровне относительно друг друга, и два пользователя одновременно отправят
запрос, и  у первого произойдет проверка отсутствия записи которая вернет true, после
чего произойдет внесение данных. Но так как два пользователя отправили запрос в одно
и тоже время, у второго проверка записи будет выполнена в то же время, и не успеет
вернуть false, так как внесение данных от первого пользователя ещё не произошло. 

Получается поимеем две записи?

Такое вообще возможно? Не только в php, а и в программировании в целом. 
    


Ответы

Ответ 1



Получается поимеем две записи? Такое вообще возможно? Да и да. Если не предприняты меры предосторожности. Стандартная мера в этом случае, если у вас ACID-гарантии от СУБД: воспользоваться C, consistency, согласованностью. Вам нужно объяснить СУБД, что для ваших данных означает быть согласованными, и СУБД вам это обеспечит. Стандартная ситуация, при которой это возникает: когда некое поле должно быть уникальным во всех записях таблицы. Скажем, может прийти одновременно две просьбы добавить в БД число 42, а на тот момент его там ещё нет. Да, они оба проверят, что этого числа ещё в базе нет, и оба выпишут команду "вставляй 42". Но... Можно заранее объявить, что поле в таблице должно в каждой записи быть уникальным. Называется это объявление "ограничение уникальности" (uniqueness constraint). Когда оно существует, добавление одинаковых значений в разных записях приводит к нарушению согласованности, что для ACID-совместимых баз обычно гарантированно невозможно. ...и в итоге один из INSERT'ов завершится ошибкой. Если у вас в СУБД нет гарантии согласованности, то придётся заниматься местечковым велосипедостровением, чтобы обеспечить такую согласованность самостоятельно с помощью разнообразных средств обеспечения thread safety: блокировками, CAS'ом или ещё чем.

Комментариев нет:

Отправить комментарий