Атомарный эксклюзивный SQL записывает обновление

Столько входа не необходим. Нет никакой причины (в производстве) для знания, когда каждый метод запускается и заканчивается. Возможно, Вам нужно это на определенных методах, но наличие так много шума в файлах журнала делает их почти невозможными проанализировать эффективно.

необходимо зарегистрироваться, когда важные вещи происходят, такие как ошибки, пользовательские логины (контрольный журнал), транзакции запущенные, важные данные, обновленные... так на и т.д. Если у Вас есть проблема, которую Вы не можете изобразить из журналов, то можно добавить больше к ней, если необходимо..., но только если необходимый.

кроме того, только для Вашей информации, добавление, входящее в систему во время компиляции, было бы примером того, что называют Аспектно-ориентированное программирование . Вход был бы "сквозной проблемой".

7
задан David R Tribble 26 September 2009 в 02:47
поделиться

2 ответа

@@ ROWCOUNT , как известно, легко ошибиться. Например, в вашем случае. Из MSDN :

Заявления, которые упрощают присваивание всегда устанавливает @@ ROWCOUNT значение 1. Никакие строки не отправляются в клиент. Примеры этих заявлений следующие: SET @local_variable ...

Чтобы быть точным, вы должны проверить @@ ROWCOUNT сразу после UPDATE . Безопаснее использовать ROWLOCK, но в этом нет необходимости. Даже если оптимизатор решит использовать блокировку страниц, семантика «получения» верна.

Я, вероятно, предпочел бы другой подход, а именно использовать предложение OUTPUT в UPDATE :

declare @updated table (ItemId int);

update Items
set ...
output inserted.ItemId
into @updated (ItemId)
where ...

Эта схема является более устойчивой к ошибкам, а также более гибкой, поскольку она позволяет получить неизвестный ItemId: полученный идентификатор помещается в переменную таблицы @updated и может быть возвращен вызывающей стороне.

Как общее примечание, использование настоящих, зафиксированных обновлений для 'получить' пронизано проблемами, поскольку вы не можете знать, какие строки действительно получены, а какие просто заброшены (клиент отключился или потерпел крах без выпуска '

9
ответ дан 6 December 2019 в 21:16
поделиться

Операторы UPDATE на сервере SQL получают блокировку обновления, пока ядро ​​базы данных читает строки, которые нуждаются в обновлении, которая преобразуется в монопольную блокировку, когда происходит запись.

Когда монопольная блокировка находится в строке, все другие транзакции блокируются от чтения и записи (если только транзакция чтения не находится в изоляции READ UNCOMMITTED или не используется подсказка NOLOCK).

Итак, да, в его нынешнем виде ваш оператор UPDATE является атомарным транзакция с автоматической фиксацией, так что это должно быть нормально, если несколько сеансов вызывают ее одновременно. Если бы вы по какой-либо причине разбили его на несколько операторов, вам нужно было бы убедиться, что вы явно создали транзакцию в своем SP.

Комментарии Ремуса относительно @@ ROWCOUNT и общего использования слова «получить» - довольно надежный совет хотя.

3
ответ дан 6 December 2019 в 21:16
поделиться