Задача состоит в том, что у некоторого набора данных должен быть номер, который зависит от пользователя. Так вот нужно сделать INSERT, который сгенерит уникальный id, обязательно int, в зависимости от пользователя.
Как генерить уникальное поле(int) во время INSERT (MS SQL)
1
Спросил
Новые ответы
0
Пока как решения на ум пришло использование максимальной блокировке транзакции
Как то так:
DECLARE @maxId int
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION ins
SET @maxId = (SELECT ISNULL(MAX([some_id]),0) + 1
FROM [mapping]
WHERE [user_id] = @user_id)
INSERT INTO [mapping]
([some_id]
,[user_id])
VALUES
(@maxId
,@user_id)
SELECT @id = SCOPE_IDENTITY()
COMMIT TRANSACTION ins
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
и затем полученный id успользуется при вставке пар ключ->значение в другую таблицу
Накладывать эксклюзивную блокировку на таблицу... хмм... вряд ли это хорошая идея в многопользовательской среде. Понижаем гранулярность:
begin tran; GO
Такие вещи лучше делать в одной транзакции с генерацией id
Вот не знаешь до конца задачу, а пишешь, количество ключ->значение очень сильно варьируется, если бы их было постоянное значение, то задача вообще не стояла бы.
И что из написанного вызвало раздражение уважаемого аффтара? Что блокировать всю таблицу и сериализовать все обращения к ней (в том числе и SELECT-ы, между прочим) - это порочная практика?
Мне, честно говоря, фиолетово, как Вы напроектировали свою БД, я лишь предложил техн. прием, понижающий конфликты блокировок (хинт XLOCK в данном случае). И вообще, лучше создать отдельную таблицу под счетчики для [some_id].