2015-09-17 2 views
0

я написал процедуру, как показано ниже строк кодаКоличество транзакций после EXECUTE вопрос

ALTER PROCEDURE [dbo].[CountrySave] 
(
@CountryId uniqueidentifier, 
@CountryName nvarchar(max) 
) 
AS 
begin tran 
if exists (select * from Country where CountryID [email protected]) 
begin 
update Country set 
CountryID = @CountryId, 
CountryName [email protected] 
where CountryID = @CountryId 
end 
else 
begin 
insert INTO Country(CountryID, CountryName) values 
(NewID(),@CountryName) 
end 

Он бросает «Количество транзакций после EXECUTE указывает на несовпадение количество Бегин и COMMIT заявления. Предыдущее количество = 0, текущее значение счетчика = 1.

Сделка, которая была запущена в партии MARS, по-прежнему активна в конце партии. Сделка отменяется ». сообщение об ошибке при выполнении !!! Пожалуйста, помогите ...

+0

Добавить 'COMMIT TRAN' в конце концов, если все в порядке. Вы должны заключить транзакцию с 'BEGIN TRY ... BEGIN CATCH' и откат при возникновении ошибки – lad2025

+0

Можете ли вы добавить код ... –

ответ

0

Добавить COMMIT TRAN

ALTER PROCEDURE [dbo].[CountrySave] 
    @CountryId uniqueidentifier, 
    @CountryName nvarchar(max) 
AS 
BEGIN 
BEGIN TRY 
    BEGIN TRAN 

    if exists (select * from Country where CountryID [email protected]) 
    begin 
     update Country 
     set CountryID = @CountryId, 
      CountryName [email protected] 
     where CountryID = @CountryId; 
    end 
    else 
    begin 
     insert INTO Country(CountryID, CountryName) 
     values(NewID(),@CountryName) 
    end 

    COMMIT TRAN 
END TRY 
BEGIN CATCH 
    /* Error occured log it */ 
    ROLLBACK 
END CATCH 
END 
0

Сообщение об ошибке достаточно ясно. Когда вы открываете (начинаете) транзакцию, вам нужно будет что-то сделать и в конце ее.

Так вы либо ROLLBACK транзакция (в случае неудачи одного из операторов в рамках транзакции), либо вы выполните COMMIT транзакцию, чтобы фактически осуществить все изменения сделанные вами заявления.

Из MSDN:

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

Дополнительная информация: https://msdn.microsoft.com/en-us/library/ms188929.aspx

0

Ваша проблема в том, что вы начинаете транзакцию, но вы никогда не совершить его/сделать откат.

Попробуйте эту структуру для вашей процедуры, работал очень хорошо для меня в прошлом:

CREATE PROCEDURE [dbo].SomeProc 
    (@Parameter INT) 
AS 
BEGIN 
    --if you want to be to only active transaction then uncomment this: 
    --IF @@TRANCOUNT > 0 
    --BEGIN 
    -- RAISERROR('Other Transactions are active at the moment - Please try again later',16,1) 
    --END 

    BEGIN TRANSACTION 

    BEGIN TRY 
     /* 
      DO SOMETHING 
     */ 

     COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
     --Custom Error could be raised here 
     --RAISERROR('Something bad happened when doing something',16,1) 

     ROLLBACK TRANSACTION 
    END CATCH 
END