В чем разница между неявной и явной транзакцией в Sql Server 2008?
Что происходит в фоновом режиме TransactionScope? Я использую TransactionScope, но в профилировщике сервера Sql я не вижу оператора "Начать транзакцию...".
Как это работает?
В чем разница между неявной и явной транзакцией в Sql Server 2008?
Что происходит в фоновом режиме TransactionScope? Я использую TransactionScope, но в профилировщике сервера Sql я не вижу оператора "Начать транзакцию...".
Как это работает?
По сути, в С#, когда вы устанавливаете для TransactionScope значение Implicit, он вызывает команду SQL Server SET, чтобы перевести соединение в режим IMPLICIT_TRANSACTIONS. Все, что вы делаете (используя одну из команд, перечисленных во второй ссылке), запускает транзакцию, которая остается открытой до тех пор, пока не будет выполнена фиксация. Если в конце соединения не выполняется фиксация, выполняется неявный ROLLBACK.
Это отличается от настройки OFF, которая также помещает каждый оператор в транзакцию - отличие состоит в том, что в режиме OFF (поэтому транзакции являются явными) каждая транзакция (отдельный оператор) немедленно фиксируется.
implicit_transactions off
, если вы (явно) используете BEGIN TRANSACTION ...
, в противном случае это называется режимом autocommit.
- person jlb; 09.01.2017
В режиме явных транзакций вам нужно будет явно запустить транзакцию. В режиме неявных транзакций транзакция автоматически запускается после каждой фиксации. Так что вам останется только зафиксировать.
Поскольку транзакция запускается «неявно», в журналах вы не увидите явное «НАЧАЛО». :)
По умолчанию база данных работает в режиме явных транзакций с включенной автоматической фиксацией транзакций. На самом деле это означало, что если явная транзакция не запускается с помощью BEGIN TRANSACTION, каждое изменение данных запускается в отдельной транзакции, которая фиксируется после оператора. Это позволяет базе данных откатывать весь оператор в случае сбоя (например, массовая вставка или вставка, которая изменяет другие данные в триггере).
Неявная транзакция — это автоматическая фиксация. У сделки нет ни начала, ни конца.
Explicit Transaction имеет начало, завершение и откат транзакций с помощью команд Begin Transaction, Commit Transaction и Rollback Transaction.
В явной транзакции, если между ними возникает ошибка, мы можем выполнить откат к началу транзакции, чего нельзя сделать в неявной транзакции.
SqlTransaction
, который TransactionScope
использует под прикрытием, отправляет команды T-SQL BEGIN TRANSACTION
только для SQL Server 2000 и более ранних версий.
Для SQL Server 2005 и более поздних версий протокол TDS был расширен, чтобы позволить клиентам напрямую манипулировать транзакциями, не отправляя BEGIN TRANSACTION
и т. д. Чтобы увидеть их в Profiler, выберите события «TM: Начало запуска транзакций» и т. д. Вам, вероятно, потребуется проверить установите флажок «Показать все события», чтобы увидеть эти события — они находятся в категории «Транзакции».
См. раздел Запрос диспетчера транзакций в документации по протоколу TDS, TM: Begin Tran Starting Event Class в документации Profiler и SqlInternalTransaction.ExecuteTransactionYukon в источнике ссылок .NET.