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

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

Что происходит в фоновом режиме TransactionScope? Я использую TransactionScope, но в SQL server profiler я не вижу "начать транзакцию..." заявление.

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

4 ответов


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

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


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

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

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


неявная транзакция является автоматической фиксации. Нет ни начала, ни конца сделки.

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

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


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

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

посмотреть Запрос Менеджера Транзакций в документации протокола TDS,TM: начать Tran начиная класс событий в документации профилировщика и SqlInternalTransaction.ExecuteTransactionYukon в справочном источнике .NET.