@azariil

Как правильно сгененрировать номер фактуры?

Наверно вопрос стар как мир, но не могу найти для себя однозначного ответа. Есть небольшой веб-проект на PHP и MySQL. Мне нужно генерировать фактуры для пользователей при оформлении заказа. Использовать AUTO_INCREMENT не могу, потому что каждый год нужно сбрасывать счетчик. Пока нашел такое решение: сделать отдельную таблицу со счетчиками по годам и при создании новой фактуры брать оттуда номер и увеличивать его на 1. Но возникает следующая проблема: если сделать запросы создания новой фактуры, выборки номера и увеличения номера в транзакции, то как тогда быть с параллельными запросами. если одна из транзакций решит откатить состояние? Может кто сталкивался с такими задачами и может поделится ссылкой на хороший материал или опытом?
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 3
tsklab
@tsklab
Системный администратор, программист
Запись не будет завершена — ничего страшного, номера фактур должны быть последовательны и только.
Уточнение: хронологически последовательны, но это неявно выполняется, если дату документа присваивать вместе с номером.

оптимистичной блокировкой
Нет. Нужна пессимистическая.
Пессимистическая блокировка схожа с принципом Мерфи. Она предполагает, что если что-то плохое может случится, это обязательно случится. В отличии от пессимистической, оптимистическая блокировка предполагает что во время обновления записи в БД мы будем единственными кто ее меняет. В большинстве случаев, так и есть, так что оптимизм оправдан. Тем не менее, во время UPDATE’а мы проверяем наверняка изменилась ли запись с момента ее чтения. И если изменилась, то мы обязаны прочитать последнюю версию записи из БД и повторить нашу операцию с ней.
Ответ написан
@azariil Автор вопроса
К сожалению один из комментариев был удален (по неизвестной мне причине), но там было предложено воспользоваться оптимистичной блокировкой. Кто что думает по этому поводу? Мне интересно кто как обрабатывает блокировки? Просто вернуть пользователю сообщение об ошибке или попытаться выполнить запрос несколько раз?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы