Разница между неявной и явной транзакцией

В чем разница между транзакциями Implicit и Explicit в Sql Server 2008?

Что происходит на фоне TransactionScope? Я использую TransactionScope, но в профилировщике Sql-сервера я не вижу инструкции "Начать транзакцию...".

Как это работает?

Ответ 1

В основном, в С#, когда вы устанавливаете TransactionScope в Implicit, он вызывает команду SQL Server SET, чтобы установить соединение в режим IMPLICIT_TRANSACTIONS. Все, что вы делаете (используя одну из команд, перечисленных во 2-й ссылке), запускает транзакцию, которая остается открытой до момента фиксации. Если в конце соединения не выполняется коммит, выполняется неявный ROLLBACK.

Это отличается от настройки OFF, которая также переносит каждый оператор в транзакцию - разница в том, что в режиме OFF (поэтому транзакции явны) каждая транзакция (сингулярная заявка) совершена немедленно.

Ответ 2

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

Поскольку транзакция запускается "неявно", вы не увидите явного "BEGIN" в журналах.:)

По умолчанию база данных работает в явном режиме транзакции с включенными транзакциями автокоммутации. Это фактически означает, что, если явная транзакция не запущена с использованием BEGIN TRANSACTION, каждая модификация данных запускается в отдельной транзакции, которая выполняется после инструкции. Это позволяет базе данных откатывать весь оператор, когда он терпит неудачу (например, объемная вставка или вставка, которая модифицирует другие данные в триггере).

Ответ 3

Неявная транзакция - это автоматическая фиксация. Нет начала или окончания транзакции.

Явная транзакция имеет начало, окончание и откат транзакций с помощью команды Начать транзакцию, совершить транзакцию и отменить транзакцию.

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

Ответ 4

SqlTransaction - который TransactionScope использует под обложками - отправляет только команды T-SQL BEGIN TRANSACTION для SQL Server 2000 и ранее.

Для SQL Server 2005 и более поздних версий протокол TDS был расширен, чтобы позволить клиентам напрямую манипулировать транзакциями без отправки BEGIN TRANSACTION и т.д. Чтобы увидеть их в профилировщике, выберите события "TM: начать переход" и т.д. вероятно, нужно будет проверить флажок "Показать все события", чтобы увидеть эти события, - они находятся в категории "Транзакции".

См. Запрос транзакционного менеджера в документации протокола TDS, TM: Начать Tran Starting Event Class в документации Profiler и SqlInternalTransaction.ExecuteTransactionYukon в исходном источнике .NET.