#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'ом или ещё чем.
Комментариев нет:
Отправить комментарий