Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > вложенные транзакции


Автор: _AMD_ 6.2.2009, 11:25
есть код
Код

begin tran a 
    ...
begin tran b
        ...
rollback tran b
        ...
commit tran a

все действия, которые находятся во вложенной транзакции не отменяются. почему?
И еще один вопрос. Одна Stored-процедура начинает транзакцию, вызывает другую процедуру, в которой также есть своя транзакция. Вторая процедура может отменить свою транзакцию. Если это происходит то она сообщает об этом первой и и в свою очередь отменяет свою транзакцию. У меня вот такая ошибка:

System.Data.SqlClient.SqlException: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

не понимаю в чем дело.

Автор: Zioma 6.2.2009, 13:54
Цитата(_AMD_ @  6.2.2009,  09:25 Найти цитируемый пост)
И еще один вопрос. Одна Stored-процедура начинает транзакцию, вызывает другую процедуру, в которой также есть своя транзакция. Вторая процедура может отменить свою транзакцию. Если это происходит то она сообщает об этом первой и и в свою очередь отменяет свою транзакцию. У меня вот такая ошибка:

System.Data.SqlClient.SqlException: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

не понимаю в чем дело.


Взято из BOL'а:
Код

Фиксация внутренних транзакций не учитываются компонентом SQL Server. Транзакция либо фиксируется, либо откатывается
в зависимости от предпринятого действия в конце самой внешней транзакции. Если внешняя транзакция зафиксирована, внутренние
вложенные транзакции также будут зафиксированы. Если внешняя транзакция откатывается, то все внутренние транзакции также будут
отменены, независимо от того, были ли отдельные внутренние транзакции зафиксированы.


Что касается первого примера, то он вообще работать не будет. То есть на
Код

rollback tran b

должна высветится ошибка
Код

Cannot roll back b. No transaction or savepoint of that name was found.


Все потому, что 
Код

Нельзя ссылаться на внутренние транзакции набора именованных вложенных транзакций для аргумента transaction_name инструкции
ROLLBACK TRANSACTION. Аргумент transaction_name может ссылаться только на имя самой внешней транзакции. Если инструкция
ROLLBACK TRANSACTION transaction_name с именем самой внешней транзакции выполняется на любом уровне набора вложенных
транзакций, для всех вложенных транзакций будет выполнен откат. Если инструкции ROLLBACK TRANSACTION выполняются
без аргумента transaction_name на любом уровне набора вложенных транзакций, происходит откат всех вложенных транзакций, включая самую внешнюю транзакцию.

Автор: _AMD_ 6.2.2009, 14:21
благодарю. методом проб и ошибок понял свою ошибку и переделал все процедуры. а уже потом прочитал Ваш ответ. smile

Автор: uranpro 26.10.2009, 17:40
Добрый день!
Продолжаю тему! Автор не пожелал поделиться выходом из ситуации =(

Как реализовать такую конструкцию ?
Код

begin tran t1;
...
begin tran t2;
...
rollback tran t2;
...
commit t1;

Автор: _AMD_ 27.10.2009, 01:22
давно это было. немного забросил программирование.
кажется я просто переделал код, чтобы было без вложенных транзакций.

Автор: uranpro 27.10.2009, 14:01
понятно =(

Автор: Itsys 27.10.2009, 16:22
uranpro, А у тебя конкретная проблема или так на уровне поинтересоваться? Водь всегда можно решить задачу без вложенных транзакций

Автор: uranpro 27.10.2009, 16:46
есть приложение, которое работает с бд(больше пяти таблиц), все связанны с друг другом, начиная с первой до последней. т.е. если удалить строку из 1 таблы, то каскадом удалится во всех остальных.
информация вносится по ступеням)
хотелось реализовать что-то типа возможности отмены изменений на всех ступенях)
придумывать велосипед что-то не хочется) думал может есть варианты у кого

Автор: Itsys 27.10.2009, 21:29
Брр... тогда не понятно, зачем вложенные транзакции... Одна большая транзакция, которая фиксит все изменения во всех таблицах либо откатывает опять же все изменения...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)