Класс.NET TransactionScope и T-SQL TRAN COMMIT и ROLLBACK

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

У меня вопрос, я также обязан использовать COMMIT TRAN, и ROLLBACK TRAN - это каждая из моих хранимых процедур, если я использую класс TransactionScope в моей библиотеке классов.NET?

4 ответа

Решение

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

Есть некоторые проблемы с производительностью при использовании его на 2000 и старше по сравнению с 2005.

Смотрите здесь

Спасибо

Нет, вам не нужны явные транзакции, если вы используете TransactionScope для своих транзакций - однако: важно, что вы, вероятно, должны установить Transaction Binding=Explicit Unbind; в строке подключения. Полная информация здесь, но в противном случае вы можете получить откат нескольких первых операций, а также несколько последних фиксаций (или, скорее, выполнение вне какой-либо транзакции).

Если вы зачислены в TransactionScope или же CommittableTransaction тогда я настоятельно рекомендую вам НЕ создавать явные локальные транзакции, используя begin transaction или же SqlConnection.BeginTransaction,

TransactionScope/CommittableTransaction являются другой "семьей" и являются взаимоисключающими begin transaction/SqlTransaction

Поэтому я бы не согласился с Саиф Ханом. Это правда, что System.Transactions имеют проблемы с производительностью на Sql 2000, поэтому может быть лучше использовать SqlTransaction или begin transaction вместо. Однако, если вы сделаете это, вы НЕ должны также использовать TransactionScope/CommittableTransaction.

Кстати, поведение, описанное Марком Гравеллом, было изменено в.Net 4.0. Даже если вы не используете Explicit Unbind, больше невозможно откатить некоторые команды, а некоторые зафиксировать. (Однако он прав, что в старых версиях вы должны использовать Explicit Unbind).

Вам не нужно - это должно быть обработано в TransactionScope. Это немного зависит от того, что именно вы делаете, и как вы обрабатываете транзакции (явные или неявные). Подробнее ЗДЕСЬ

Другие вопросы по тегам