Mysql — Предотвращает дублирование записи для добавочного значения в поле

#php #mysql #sql #codeigniter #locking

Вопрос:

Мой сайт размещен на общем хостинге. Это POS-приложение (PHP, Codeigniter). У него есть несколько пользователей. Каждый создает счет-фактуру. Номер счета-фактуры является добавочным. То есть, когда пользователь отправляет форму счета-фактуры, он выбирает последний номер счета-фактуры, затем увеличивает его на единицу, а затем создает новую строку с новым номером счета-фактуры. Этот процесс некоторое время (очень редко) дублирует номер счета, сгенерированный, когда пользователи отправляют форму практически в одно и то же время.

Один из возможных способов-сделать счет уникальным. Но если это произойдет снова, пользователь увидит исключение или отформатированное сообщение об ошибке.

Я не хочу показывать ошибку своим пользователям. Потому что , когда они отправляют форму счета-фактуры, она содержит информацию о продажах, которую они написали. Если они теряют его из-за этого предупреждения, они чувствуют беспокойство. AJAX не будет работать. Прямая отправка работает здесь(для отправки счета-фактуры ).

Можно ли применить блокировку SQL в этой ситуации? Я понятия не имею о блокировке SQL.

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

1. пожалуйста, отправьте свой код.

2. Используйте первичный ключ автоматического увеличения.

3. Первичный ключ автоматического приращения уже есть. Я использую другую колонку(int) для номера счета-фактуры.

4. Да, у codeigniter есть функция для этого. codeigniter.com/userguide3/database/transactions.html

5. @sukalogika может ли транзакция запретить другому пользователю считывать последний номер счета-фактуры, пока другой пользователь одновременно пишет таблицу? Я хочу предотвратить чтение (при написании счета-фактуры), потому что, если пользователь не может читать, дубликат значения не может быть получен.

Ответ №1:

Если вас беспокоит не производительность, неэффективным способом было бы что-то вроде вставки номера счета-фактуры как нулевого/нулевого и обновления другого запроса, который

Нравится

 INSERT INTO invoices (id, invoice_number) VALUES (10001, null);
UPDATE invoices SET invoice_number = id WHERE invoice_number IS NULL;
 

Для замков вы можете посмотреть в разделе ВЫБОР … ДЛЯ ОБНОВЛЕНИЯ, которое заблокировало бы последнюю строку чтения, а также вставки из других подключений также блокируются, но лучше попробовать это в вашей базе данных, так как это зависит от вашей версии Mysql и установленных уровней изоляции.