Я работаю над биллинговой системой (код C#, серверная часть MySQL Galera Cluster, механизм хранения InnoDB) и сомневаюсь, как создать действительно уникальный порядковый номер для счетов-фактур.
Обычно в других системах я создавал уникальную службу для получения номеров счетов, всякий раз, когда счет генерировался, я запрашивал у этой службы номер, и поскольку эта служба гарантировала эксклюзивный доступ к таблице, в которой находился счетчик, проблем не было бы вообще. .
Но эта новая система кластеризована для обеспечения высокой доступности, поэтому такой подход неприемлем, поскольку должно быть запущено несколько таких служб.
Итак, логика, которую я применяю здесь, такова:
- начать транзакцию
- создать счет без серийного номера
- получить последовательный счетчик
- записать новый счетчик в таблицу
- обновить счет-фактуру
- совершить
Если я не ошибаюсь, если какая-то другая транзакция обновит счетчик до того, как текущая транзакция будет завершена, тогда фиксация вызовет исключение, и я смогу повторить операцию, что обеспечит последовательность номеров счетов.
Итак, мой вопрос: какой из них является правильным уровнем изоляции для достижения этой цели? достаточно ли READ_COMMITED или могут возникнуть дубликаты? Или есть лучший подход к этому?