Нужно ли инкапсулировать один оператор слияния (со вставкой, удалением и обновлением) в транзакции?
Я не могу проверить его и получить решение самостоятельно прямо сейчас, и я не нашел информацию о MSDN или в Google.
Я был допрошен, если оператор слияния, который вставляет, удаляет и обновляет записи в данной таблице, должен быть инкапсулирован в транзакцию (если сбой происходит после того, как вставки были сделаны, например, при обновлении) или если какой-либо из операции завершаются с ошибкой, а также полное слияние.
Возможно, это не повредило бы, если бы мы включили транзакцию, но ради любопытства мы хотим узнать больше о внутренних слияниях.
Ответы
Ответ 1
Любой оператор SQL Server является транзакцией в своем собственном праве.
То есть, он является атомарным: все преуспевает или все терпит неудачу
Явная транзакция будет использоваться для группировки нескольких одиночных атомных операторов в одну большую атомную транзакцию.
Это красота MERGE: нет необходимости в явной транзакции и 3 отдельных операторах.
Ответ 2
Все инструкции DML в SQL Server выполняются в неявной транзакции, если явный не запущен. Конечно, вы все равно можете обернуть его в свою явную транзакцию, но не нужно.
Ответ 3
Каждый запрос выполняется в транзакции, всегда. Если вы не создаете транзакцию, сам запрос имеет свою собственную транзакцию. Если что-то пойдет не так, весь запрос откат.
Если вы хотите сделать еще некоторую обработку ошибок, вам может понадобиться транзакция вокруг нее, но это не обязательно для согласованности базы данных.
Ответ 4
Как и другие, вам не нужна транзакция, но вы должны подумать о своем уровне изоляции транзакций или намеках, если вы делаете что-то вроде upsert. Использование слияния для upserts может вызвать конфликты в конфигурации по умолчанию.