Нужно ли инкапсулировать один оператор слияния (со вставкой, удалением и обновлением) в транзакции?

Я не могу проверить его и получить решение самостоятельно прямо сейчас, и я не нашел информацию о MSDN или в Google.

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

Возможно, это не повредило бы, если бы мы включили транзакцию, но ради любопытства мы хотим узнать больше о внутренних слияниях.

Ответ 1

Любой оператор SQL Server является транзакцией в своем собственном праве.

То есть, он является атомарным: все преуспевает или все терпит неудачу

Явная транзакция будет использоваться для группировки нескольких одиночных атомных операторов в одну большую атомную транзакцию.

Это красота MERGE: нет необходимости в явной транзакции и 3 отдельных операторах.

Ответ 2

Все инструкции DML в SQL Server выполняются в неявной транзакции, если явный не запущен. Конечно, вы все равно можете обернуть его в свою явную транзакцию, но не нужно.

Ответ 3

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

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