Транзакции SQLTransaction и T-SQL - PullRequest
2 голосов
/ 24 декабря 2008

Я использую .NET 2.0 и SQL Server 2005. По историческим причинам код приложения использует SQLTransaction, но некоторые хранимые процедуры также используют операторы T-SQL begin / commit / rollback tran. Идея состоит в том, что DBTransaction может охватывать много хранимых процедур, которые каждый отдельный sproc контролирует, что происходит в его области действия - по сути, это вложенные транзакции.

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

Проблема заключается в том, что, по крайней мере, так как это в настоящее время закодировано, заключается в том, что если какой-либо из sprocs выполняет ROLLBACK, внешняя транзакция SQLT потеряет свое соединение, поэтому любая последующая попытка повторного использования транзакции завершится неудачей. Есть ли способ откатить в T-SQL, но по-прежнему поддерживать внешнюю транзакцию SQL? Я думал, что, возможно, точки сохранения могут быть полезны здесь, но я их пока не очень хорошо понимаю.

Что усложняет эту ситуацию, так это то, что не всегда существует внешняя транзакция, поэтому я не могу просто удалить откаты T-SQL, т.е. иногда sproc выполняется сам по себе; иногда в контексте транзакции.

Упростит ли переключение на TransactionScope?

Спасибо за любые предложения ... Майк

Ответы [ 3 ]

0 голосов
/ 24 декабря 2008

Я бы посоветовал вам рассмотреть вопрос о размещении вашей внешней транзакции в хранимой процедуре, чтобы поддерживать все ваши вложенности в TSQL (используйте EXEC для вызова других хранимых процедур). SQL Server является удивительно богатой средой разработки / управления данными и позволит вам управлять своими транзакциями способами, которые ADO обрабатывает неуклюже. Имейте также в виду, что почти всегда более эффективно объединять несколько групп SQL в хранимом процессе, чем совершать несколько вызовов через соединение ADO.

0 голосов
/ 26 декабря 2008

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

0 голосов
/ 24 декабря 2008

Взгляните на эту запись базы знаний:

Может возникнуть непредвиденное исключение, когда транзакция фиксируется или откатывается после ошибки источника данных

Откат транзакции внутри хранимого процесса приведет к исчезновению любой «внешней» транзакции в вашем клиенте ADO.NET. Единственное решение - заключить вызов Rollback () в блок try / catch. Я не верю, что можно поддерживать внешнюю транзакцию, если это произойдет.

...