Класс.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. Это немного зависит от того, что именно вы делаете, и как вы обрабатываете транзакции (явные или неявные). Подробнее ЗДЕСЬ