Re: MSSQL2005/08: генерация идентити
От: Козьма Прутков Россия  
Дата: 27.01.09 21:30
Оценка:
Здравствуйте, Andro1900, Вы писали:

A>Табличка в ней PK int identity(1,1)


A>Теперь мне нужно эти значения без таблички генерить

A>Беспокоит мысль: если два клиента одновременно вызовут процедуру/функцию генерации этого значения, то она (процедура/ф-ция) вернёт одинаковые значения
A>Мне бы этого не хотелось
A>ps. что-то наподобие ораклийного сиквенса должно получиться

d_m правльно говорит: не получится сиквенса. Сиквенс и identity штуки нетранзакционные. То есть транзакция при откате не откатывает их состояние назад. Это дает возможность не блокировать их, то есть получил значение — отходи, следующий.
С таблицей все иначе. Если транзакция что-то в ней поменяла, то никто другой не может ни прочитать ни поменять данные, поскольку стоит блокировка (ну, для оракла может и не совсем так, но состояние сиквенса точно не откатывается). Если это не беспокоит, и нужно просто получать последовательные значения, то делается так:
1) создается табличка типа KeyTable(LastId int not null)
2) пишется процедура с текстом типа:

proc GetKey @id int out
as
update KeyTable set @id = LastId + 1, LastId = LastId + 1
Да хранит вас господь в сухом прохладном месте...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.