Я работаю над проектом продаж с использованием SQL Server (версии 2008 и 2012).Мне нужно вставить данные о продажах в таблицу и создать номер счета для этих данных.Я сделал это, установив свой столбец invoiceNumber
как столбец идентификаторов, который увеличивается на единицу.
Но теперь у нас есть требование, чтобы в номере нашего счета-фактуры не было разрыва между ними (если счет не удален. Удаленный счет-фактура будет храниться в отдельных таблицах).
Столбцы идентификаторов теряют номера счетов при сбое транзакции.Начиная с SQL Server 2012, он может увеличиваться на 1000 при перезапуске сервера.Чтобы избавиться от этой проблемы, я вынужден использовать операторы INSERT SELECT
, как показано ниже
INSERT INTO SalesTable(InvoiceNumber, col1, col2)
VALUES ((SELECT MAX(SalesId) FROM SalesTable + 1), value1, value2)
Это может работать нормально, если мое программное обеспечение работает на одной машине.
Мой вопрос: если я использую этот код в своем программном обеспечении, когда несколько пользователей одновременно создают накладные по продажам, есть ли возможность для двух накладных получить один и тот же номер накладной?Я имею в виду своего рода дублирование номера счета?
Предотвратит ли проблема использование блокировки таблицы перед вставкой данных?если да как это сделать?Какие проблемы связаны с использованием блокировок?
Я нашел похожие вопросы, но не нашел ответа, чтобы решить эту проблему наилучшим образом.
Любая помощь по этому вопросу будет принята с благодарностью.Спасибо.