169 похожих чатов

День добрый Как произвести "безопасную" операцию с SQL таблицей? К примеру есть

стандартная форма регистрации с email и паролем, на сервер отправляется запрос на создание нового пользователя с заданными данными, но перед этим в базе проверяется не зарегистрирован ли уже пользователь с таким email (в данном примере email уникальное значение строки)

Вопрос. Если параллелью несколько людей попытаются зарегистрироваться с одинаковым email адресом не произойдет ли такое что все они успешно пройдут регистрацию?
Ведь на момент их регистрации email адрес еще не будет добавлен в таблицу.

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

7 ответов

19 просмотров

https://www.php.net/manual/ru/book.pdo.php

В SQL есть транзакции и уровни изоляции этих транзакций. Стоит об этом почитать. А так, если очень кратко: по умолчанию включëн автокоммит: это значит каждый запрос будет выполняться в своей неявной транзакции. Вместо этого необходимо сделать так: 1) запустить транзакцию 2) проверить наличие строки с помощью SELECT ... FOR UPDATE 3) если еë нет, вставить такую строку SELECT ... FOR UPDATE повесит пессимистическую блокировку, что будет держать остальные запросы на эту же строку.

allpeg
В SQL есть транзакции и уровни изоляции этих транз...

блокировать надо таблицу, а не строку. Пока вы блокируете несуществующую строку, другие запросы из очереди добавят этот email. Разве нет?

Vitaliy Monashenkov
блокировать надо таблицу, а не строку. Пока вы бло...

Блокируется не несуществующая строка, а все ключи из запроса

allpeg
Блокируется не несуществующая строка, а все ключи ...

какие ключи? SELECT… FOR UPDATE — блокирует считываемые строки на чтение. Точно такую же блокировку ставит обычный UPDATE, когда считывает данные для обновления.

allpeg
В SQL есть транзакции и уровни изоляции этих транз...

Разве нельзя уровень изоляции поднять до serializable?

@Thermophoto
Разве нельзя уровень изоляции поднять до serializa...

При уровне serializable если сделать запрос на select а затем insert с двух транзакций будет одно из двух (в зависимости от того какая бд) 1) запрос на select станет блокирующим другую транзакцию 2) оба запроса на селект скажут что всё ок, но потом один из INSERT ов выкинет ошибку сериализации

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
TCodePointer = record cp: CodePointer; name: string; cnt: Integer; next: TCodePointerArray; // этот тип ещё неизвестен end; TCodePointerArray = array of ...
notme
9
Привет ) есть такой кусок кода, он считывает ini файл. my $conf = Config::IniFiles->new( -file => $ini_file ); if (!$conf) { $self->my_die('cannot_read_cfg', ...
Kolya lastname
7
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
13
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Ну тогда у меня вопрос... ) А вот в Delphi 7, к примеру, это что не решаемая задача была бы? (дженериков то ещё нету) Эта: https://t.me/Delphi_Lazarus/319568
notme
5
здравствуйте, братья, кто-нибудь знает, как работать с Swift.com или Swift.net?
Ozzy
6
@wit01d How are you? What are you studying these days, curious man ?
Sahand 🏔️
6
💵 Хочешь получать стабильный заработок от 600 и до 800 $ в неделю ? 📱Для работы нужен только телефон. 🛑БЕСПЛАТНОЕ обучение для каждого. 🔶 Не имеет значения, есть ли у вас оп...
Бағдат Амир
3
Карта сайта