Функция SQL Server - предотвращение дублирования
У меня есть база данных SQL Server 2005. Table A
имеет столбец идентичности в нем, а также другое руководство Id
столбец, который охватывает несколько строк. Второй id
столбец в формате '0000000098'
и должен быть строкой. Я не могу изменить тип данных.
Function A
получает максимум ID
значение столбца, увеличивает его на единицу, приведение в виде строки.
Мой сохраненный процесс получает новый идентификатор, а затем делает несколько вставок, используя этот идентификатор.
Как я могу запретить двум клиентам запускать хранимую процедуру и получать одинаковые идентификаторы до обновления? Могу ли я заблокировать таблицу a от чтения до тех пор, пока процесс не завершит обработку или есть более эффективный способ?
Если бы я мог изменить тип данных и / или структуру, это было бы легко, но я не могу.
2 ответа
Если вы можете сформулировать свою функцию как единый UPDATE
оператора, то явной блокировки не требуется - UPDATE
заявление потребует обновления блокировки (U
), и это эксклюзивно, например, два читателя не могут получить блокировку обновления в одной и той же строке одновременно.
UPDATE dbo.TableA
SET ManualID = CAST(CAST(ManualID AS INT) + 1 AS VARCHAR(20))
OUTPUT Inserted.ManualID -- return the newly inserted manual ID for your use
WHERE ..........
Если вам нужен двухэтапный процесс - SELECT
до UPDATE
- тогда я бы использовал WITH (UPDLOCK)
намек на SELECT
DECLARE @OldManualID VARCHAR(20)
BEGIN TRANSACTION
SELECT @OldManualID = ManualID
FROM dbo.TableA WITH (UPDLOCK)
WHERE........
-- do something with that manual ID
UPDATE dbo.TableA
SET ManualID = (new value of ManualID)
WHERE ..........
COMMIT TRANSACTION
В обоих случаях, поскольку один UPDATE или SELECT/UDPATE выполняются под блокировкой обновления, два процесса не могут запускать это одновременно. Я не думаю, что вам вообще нужна дополнительная блокировка - скорее всего, не полная блокировка таблицы....
Да, вы можете заблокировать стол. Вы должны делать все внутри транзакции, и когда вы впервые читаете таблицу, вы можете установить на нее эксклюзивную непрерывную блокировку с подсказками (updlock, holdlock) или даже (TABLOCKX)