В чем разница между транзакциями Implicit и Explicit в Sql Server 2008?
Что происходит на фоне TransactionScope? Я использую TransactionScope, но в профилировщике Sql-сервера я не вижу инструкции "Начать транзакцию...".
Как это работает?
В чем разница между транзакциями Implicit и Explicit в Sql Server 2008?
Что происходит на фоне TransactionScope? Я использую TransactionScope, но в профилировщике Sql-сервера я не вижу инструкции "Начать транзакцию...".
Как это работает?
В основном, в С#, когда вы устанавливаете TransactionScope в Implicit, он вызывает команду SQL Server SET, чтобы установить соединение в режим IMPLICIT_TRANSACTIONS. Все, что вы делаете (используя одну из команд, перечисленных во 2-й ссылке), запускает транзакцию, которая остается открытой до момента фиксации. Если в конце соединения не выполняется коммит, выполняется неявный ROLLBACK.
Это отличается от настройки OFF, которая также переносит каждый оператор в транзакцию - разница в том, что в режиме OFF (поэтому транзакции явны) каждая транзакция (сингулярная заявка) совершена немедленно.
В режиме "Явная транзакция" вам нужно будет начать транзакцию явно. В режиме неявных транзакций транзакция автоматически запускается после каждой фиксации. Так что вам нужно будет только совершить.
Поскольку транзакция запускается "неявно", вы не увидите явного "BEGIN" в журналах.:)
По умолчанию база данных работает в явном режиме транзакции с включенными транзакциями автокоммутации. Это фактически означает, что, если явная транзакция не запущена с использованием BEGIN TRANSACTION, каждая модификация данных запускается в отдельной транзакции, которая выполняется после инструкции. Это позволяет базе данных откатывать весь оператор, когда он терпит неудачу (например, объемная вставка или вставка, которая модифицирует другие данные в триггере).
Неявная транзакция - это автоматическая фиксация. Нет начала или окончания транзакции.
Явная транзакция имеет начало, окончание и откат транзакций с помощью команды Начать транзакцию, совершить транзакцию и отменить транзакцию.
В явной транзакции, если возникает ошибка, мы можем откат к началу транзакции, которая не может быть выполнена в неявной транзакции.
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.