Да, они атомарные, но это не значит, что вы получите то поведение, которое вам здесь нужно!Свойство, на которое нужно обратить внимание, - это изоляция.
Чтобы добиться требуемого исключения, вам нужно будет выполнить операцию SELECT
для единственного значения , взаимно исключающего .Вы можете сделать это, запросив блокировку Update
(убедитесь, что предикат WHERE
можно найти по индексу, чтобы избежать блокировки ненужных лишних строк)
SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'
Обратите внимание, что эта блокировка будет сохраняться до вашей транзакцииКоммиты, однако, не публикуются в конце критического раздела, но это всегда будет так, если вы все равно обновили значение.