2014-09-29 2 views
0

Похоже, что эта тема задается часто, и я думаю, что нашел мой вопрос answer, но теперь мне любопытно разницу между этим (и несколько другие ответы, которые я нашел) и мой SQL:Блокировка SQL Server для UPDATE с предложением WHERE и sub-SELECT

update Foos set Owner = 'me' OUTPUT INSERTED.id where Owner is null and id in 
    (select top 1 id from Foos where Owner is null) 

теперь я понимаю, что моя исходная гипотеза верна в отношении суб-выбора и параллелизм, где одновременно поток может select тот же идентификатор, как другой поток собирается update это id. Однако, действительно ли мой пункт where в статье update помогает предотвратить это состояние гонки (на уровне read committed)?

Моя теория состоит в том, что, в то время как две нити могут получить тот же идентификатор из суб- select, только один сможет update, потому что update атомная и включает в себя состояние. Другой поток завершится неудачей или обновит нулевые записи. Это правда?

+0

К сожалению, похоже, может быть, это должно было быть размещены на дБА? Никогда не знал, что существует ... – Josh

+0

В дополнение к вашим проблемам с параллелизмом вы делаете топ-1 без заказа. Вы не всегда можете получить один и тот же 1, если вы не укажете заказ. –

ответ

0

Попробуйте

;WITH CTE AS 
(
    SELECT ID, [Owner] 
    , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) rn 
    FROM Foos 
    WHERE [Owner] IS NULL 
) 
update CTE 
    SET [Owner] = 'me' 
OUTPUT INSERTED.id 
WHERE rn = 1 
Смежные вопросы