У меня возникла проблема, когда мне нужно сохранить и увеличить число номеров объектов в таблице, однако это число должно быть уникальным в данном логическом домене, а не в таблице по всему миру.Несколько уникальных счетчиков в таблице
Примером может быть несколько предприятий, планирующих несколько Рабочих мест; Job.Number должен быть уникальным в бизнесе.
Поэтому я в основном должен убедиться, что одновременные операции создания задания не производят задания с тем же номером.
В настоящее время я вижу только один способ осуществить это (в postresql):
блокировать таблицу с типом самозажимного замка, скажем, «SHARE UPDATE ЭКСКЛЮЗИВ», так что все остальные операции этого типа должны очереди и ожидания, тем самым гарантируя, что функция MAX() всегда возвращает уникальное значение.
Однако в этом решении существует огромный недостаток - он по существу создает узкое место для всех операций INSERT в таблице рабочих мест.
Я не думаю, что я могу использовать Postgreql последовательности, потому что:
- Я не хочу, чтобы создать новую последовательность для каждого нового бизнеса
- Это может иметь разрывы
бы вы предлагаете какие-либо другие способы решения этой проблемы?
Хорошо, как насчет другого подхода, который я объяснил в своем ответе ниже? Даже если Postgres не позволяет вам блокировать одну запись для чтения запросов, вы можете использовать трюки, подобные Optimistic Locking, чтобы убедиться, что только один процесс получает возможность увеличить номер процесса, а остальные терпят неудачу и должны повторить попытку (после того, сначала прочитайте текущий максимум). –
Спасибо, мне еще предстоит измерить производительность как оптимистических/пессимистических блокировок, так и посмотреть, где находится точка пересечения в количестве транзакций в минуту с точки зрения производительности. – Art