Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как залочить генерацию нового значени перед апдейтом  [new]
Mullih
Member

Откуда:
Сообщений: 12
задача у меня такая, надо сгенерировать строку, проверить что записей с такой строкой еще нет и сделать update или insert

я не совсем уверен что я лочю это действие и в один прекрасный момент не сгенерирую одинаковое значение для не 2-х и более одновременных запросов

как можно избежать возможности дублирования в моем случае ? заранее спс

сервер MSSQL 2008 R2 и SQL Azure

BEGIN TRAN
	DECLARE @userHashCode varchar(32)

	SET @userHashCode = [dbo].[RandString](32) -- моя функция возвращающая рандомную строку 
	WHILE EXISTS (SELECT * FROM [dbo].[user_User] WHERE [HashCode] = @userHashCode)
	BEGIN
		SET @userHashCode = [dbo].[RandString](32)
	END

	UPDATE [dbo].[user_User]
	SET [HashCode] = @userHashCode
	WHERE Email = @email

COMMIT TRAN
26 авг 12, 21:24    [13066491]     Ответить | Цитировать Сообщить модератору
 Re: как залочить генерацию нового значени перед апдейтом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mullih
как можно избежать возможности дублирования
Есть только один механизм - иникальный ключ/индекс.
В зависимость от подхода и требований есть разные решения задачи.
Какова вероятность совпадения генерируемого значния ?
Если мало - вам не нужен SELECT-цикл, пойдёт чисто UPDATE-цикл. Накладные требования - рестарт транзакции.
Если вероятность большая - стоит подумать о переделывания механизма генерации. Да и вообще почему не используете стандартные ?
Почему транзакция так рано начинается ? Не вижу в этом смысла. Или хотите однопоточное монопольноное блокирование всей таблы?
27 авг 12, 03:02    [13067303]     Ответить | Цитировать Сообщить модератору
 Re: как залочить генерацию нового значени перед апдейтом  [new]
Mullih
Member

Откуда:
Сообщений: 12
Mnior,

> Есть только один механизм - иникальный ключ/индекс
уникальность обеспечит но при попытке добавить дублированый ключ я получу еxception а мне надо сгенерировать другой ключ

>В зависимость от подхода и требований есть разные решения задачи.
>Какова вероятность совпадения генерируемого значния ?

вероятность мала, но это не исключает того что не это не произойдет

>Если мало - вам не нужен SELECT-цикл, пойдёт чисто UPDATE-цикл. Накладные требования - рестарт транзакции.
>Если вероятность большая - стоит подумать о переделывания механизма генерации. Да и вообще почему не используете стандартные ?

честно сказать я не знаю что такое стандартное решение поэтому это вопрос и возник у меня

>Почему транзакция так рано начинается ? Не вижу в этом смысла. Или хотите однопоточное монопольноное блокирование всей таблы?

не смогу ответить на ваш вопрос, единственно скажу на ум мне как дотнетчика пришло такое решение

PS пообщавшись с вами на ум пришло такое решение

	DECLARE @result BIT = 0

	WHILE @result = 0
	BEGIN
		BEGIN TRY

			UPDATE [dbo].[user_User]
			SET [HashCode] = [dbo].[RandString](32)
			WHERE Email = @email

			SET @result = 1
		END TRY
		BEGIN CATCH

		END CATCH
	END


правда если честно меня коробит решение через exception делать, но опять же в дот нет, возможно для MSSQL это нормально, тем более я не лочу и соответственно не создаю дополнительного узкого горлышка
27 авг 12, 11:30    [13068176]     Ответить | Цитировать Сообщить модератору
 Re: как залочить генерацию нового значени перед апдейтом  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Mullih,

если название поля соответствует назначению (HashCode), то хэш-код и не должен быть уникальным, разве не так?
А чем не устроили GUIDы (UNIQUEIDENTIFIER)?
27 авг 12, 11:35    [13068217]     Ответить | Цитировать Сообщить модератору
 Re: как залочить генерацию нового значени перед апдейтом  [new]
Mullih
Member

Откуда:
Сообщений: 12
iap,

>если название поля соответствует назначению (HashCode), то хэш-код и не должен быть уникальным, разве не так?
в принципе да, не должно, но это лишь логическое название, что бы не вводить в заблуждение давайте его назовем просто уникальный ключ

>А чем не устроили GUIDы (UNIQUEIDENTIFIER)?
в принципе как вариант и для нужной длины можно конкатировать несколько гуидов, но пролетает регистрозависимость, т.е. 'Aa' <> 'aA', тк я смогу генерировать без очень лишних телодвижений либо 'aa' либо 'AA'

PS если память не изменяет гуид не дает абсолютно уникального значения хотя и стремится к этому
27 авг 12, 11:43    [13068273]     Ответить | Цитировать Сообщить модератору
 Re: как залочить генерацию нового значени перед апдейтом  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Mullih
PS если память не изменяет гуид не дает абсолютно уникального значения хотя и стремится к этому
Если будет генерироваться на одном сервере, то даёт
27 авг 12, 11:48    [13068314]     Ответить | Цитировать Сообщить модератору
 Re: как залочить генерацию нового значени перед апдейтом  [new]
Mullih
Member

Откуда:
Сообщений: 12
iap,

я буду использовать SQL Azure и мне кажется там ферма, могу ошибаться тк конкретно этот вопрос не зандировал
27 авг 12, 11:50    [13068326]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить