Необходимо ли инкапсулировать один оператор слияния (со вставкой, удалением и обновлением) в транзакции? - PullRequest
13 голосов
/ 25 февраля 2011

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

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

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

Ответы [ 4 ]

22 голосов
/ 25 февраля 2011

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

То есть это атомарно: все успешно или все терпит неудачу

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

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

2 голосов
/ 25 февраля 2011

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

1 голос
/ 25 февраля 2011

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

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

0 голосов
/ 16 сентября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...