Похоже, что эта тема задается часто, и я думаю, что нашел мой вопрос 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
атомная и включает в себя состояние. Другой поток завершится неудачей или обновит нулевые записи. Это правда?
К сожалению, похоже, может быть, это должно было быть размещены на дБА? Никогда не знал, что существует ... – Josh
В дополнение к вашим проблемам с параллелизмом вы делаете топ-1 без заказа. Вы не всегда можете получить один и тот же 1, если вы не укажете заказ. –