Функция 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)

Другие вопросы по тегам