Я постараюсь изложить свой вопрос ясно и кратко, я разрабатываю php-приложение для курьерской компании, в котором несколько пользователей могут войти на страницу, состоящую из нескольких полей текстового поля и двух кнопок, первой кнопки (Добавить Новый) предназначен для автоматической генерации нового и пустого номера документа, который еще не вставлен в базу данных, а вторая кнопка (Сохранить) предназначена для вставки данных, взятых из полей текстового поля, вместе с номером документа в базу данных,
Теперь предположим, что два пользователя вошли на эту страницу одновременно и оба хотят вставить данные в базу данных. Предположим, что user1 нажимает кнопку «Добавить новый» и получает номер документа, например, 1000 и одновременно Пользователь user2 также нажимает кнопку «Добавить новый» и получает тот же номер документа, который уже присвоен пользователю user1, поскольку пользователь user1 еще не нажал кнопку «Сохранить», что означает, что номер документа 1000 даже не содержит ни одной строки в базе данных, поскольку ни один пользователь еще не нажал кнопку «Сохранить».
Если пользователь 1 нажал кнопку «Сохранить», вставив данные в базу данных с номером документа 1000, а затем пришел пользователь 2 и нажал «Добавить новый», он получит увеличенное значение, т. Е. 1001, и он отлично работает для меня.
Мой вопрос заключается в том, как назначить разные номера документов, если оба пользователя одновременно нажимают кнопку «Добавить новый»?
Может кто-нибудь помочь мне выйти из этого? и да, заранее спасибо 🙂
public static $is_locked = false;
function issue_document_number($params_if_required){
//for core php write this line
global $is_locked;
$is_locked = true;
//for OOP, if you are in class
$this->is_locked = true;
//make your calculations here to get desired number
$is_locked = false;
return $document_number;
}
при вызове проверьте, не заблокирована ли функция sleep
в течение 1 или 2 секунд и снова позвоните как
while($is_locked==true){
sleep(1);
}
$my_unique_number = issue_document_number($params_if_required);
сделай свой запрос и добавь в БД
Других решений пока нет …