блокировка одного поля для монопольного доступа в mariadb - PullRequest
0 голосов
/ 22 января 2019

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

Мне нужно, чтобы каждый независимый скрипт мог распределять следующий доступный номер счета-фактуры, в то же время блокируя другие скрипты, пытающиеся сделать то же самое.Пока он все еще заблокирован, число увеличивается для следующего процесса в строке.Основная цель состоит в том, чтобы избежать дублирования номеров без создания узкого места.Вторичная цель - избежать потери чисел, пропуская некоторые из них.

Было бы идеально иметь возможность заблокировать поле, хотя большей части времени было бы достаточно просто заблокировать таблицу.Количество выделений с течением времени невелико, хотя в будущем оно может возрасти.

1 Ответ

0 голосов
/ 23 января 2019

План A: Просто используйте AUTO_INCREMENT. Поскольку вы хотите один поток идентификаторов, у вас должна быть одна таблица, в которой генерируется id. Это не так много, чтобы беспокоиться о. Предостережение: В среде с несколькими основными устройствами (включая Galera / Group Replication) среда AUTO_INCREMENT не является последовательной. Предостережение: старайтесь избегать INSERT IGNORE, REPLACE, IODKU и других команд, которые могут записывать идентификаторы.

План B: иметь таблицу, выделенную только для этой задачи с порядковым номером. Напишите сохраненную функцию, чтобы получить следующий номер. Назовите его в своей собственной транзакции. Это сведет к минимуму влияние на другие действия.

Оба вышеперечисленных избегают дублирования. Однако вы не можете предотвратить пропущенные номера. Тем не менее, есть некоторые вещи, которые нужно сделать, чтобы не пропускать цифры. Минимизируйте потребность в ROLLBACK. Если вы делаете ROLLBACK, вам, вероятно, следует применить потерянный идентификатор к «аннулированному» счету. Это может сделать бухгалтеров и аудиторов счастливее.

Другая проблема: если вы используете репликацию, вы не можете гарантировать, что номера будут отображаться на ведомых устройствах монотонно. Это связано с тем, что захват идентификатора выполняется рано, но репликация происходит в COMMIT порядке.

Я голосую за План B (который может включать AUTO_INCREMENT под обложками). Это дает вам централизованное место для внесения следующего изменения, которое попросят менеджеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...