Разница между неявной и явной транзакцией - PullRequest
16 голосов
/ 13 февраля 2011

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

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

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

Ответы [ 4 ]

11 голосов
/ 14 февраля 2011

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

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

5 голосов
/ 13 февраля 2011

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

Поскольку транзакция запускается «неявно», вы не увидите явного «НАЧАЛА» в журналах. :)

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

2 голосов
/ 25 сентября 2014

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

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

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

0 голосов
/ 06 мая 2015

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

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

См. Запрос диспетчера транзакций в документации по протоколу TDS, TM: Класс начала начального события Tran в документации Profiler и SqlInternalTransaction.ExecuteTransactionYukon в. Справочный источник NET.

...