Управление вложенными транзакциями SQL Server в хранимой процедуре - PullRequest
0 голосов
/ 02 октября 2018

Я реализовал управление транзакциями в своей хранимой процедуре, но все равно получаю ошибку

Счетчик транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT.Предыдущий счетчик = 1, текущий счетчик = 0.

Когда ошибка произошла во внутренней программе, она автоматически откатывает все ожидаемые внешние процедуры (и после отката счетчик транзакций становится равным нулю), изатем SQL Server выполняет блок catch внешней программы и ожидает отката для транзакции, которую я открыл во внешней программе, что странно для меня.Я предполагаю, что когда SQL Server откатывает транзакцию, он откатывает все предыдущие txns, и я не уверен, почему он ожидает откат внешней транзакции еще раз (этот шаг уже был выполнен во время внутреннего отката txn).

Ниже приведен пример кода

create table A (ID int)

alter procedure p1 AS
begin try
begin transaction
insert into A values (1)
commit;
end try
begin catch
rollback transaction
end catch

alter procedure p2 AS
begin try
begin transaction
insert into A values ('A')
commit;
end try
begin catch
rollback transaction
end catch

alter procedure p3 AS
begin try
begin transaction
EXEC p1
EXEC p2
if @@TRANCOUNT > 0
commit;
end try
begin catch
if @@TRANCOUNT > 0
rollback transaction
PRINT ERROR_MESSAGE();
end catch

EXEC p3

Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...