2013-10-02 5 views
2

В SQL Server 2008R2, у нас есть хранимая процедура, которая выглядит следующим образом:Откат без исключения?

create procedure x(@arg1 as nvarchar(20), @arg2 ...) 
as 
begin 
    -- delete and insert values, depending on arguments 
    begin transaction; 
    delete from tblA where f1 = @arg1 ... ; 
    insert into tblB (a) select ... where f2 = @arg2 ... ; 
    commit transaction; 
end; 

Я называю эту процедуру в C# (.NET 4.5) с SqlCommand.ExecuteNonQuery() методом. Все исключения пойманы с помощью try--- catch

Теперь в документации к этому методу говорится: «Если происходит откат, возвращаемое значение равно -1».

Вопрос: Может ли быть случай возврата, не получая исключения?

До сих пор у нас всегда было исключение, если оператор sql не мог быть выполнен. Но может ли быть случай, когда откат происходит «автоматически» без исключения?

+2

hummm - Я думаю, что в зависимости от настройки XACT_ABORT вы можете добраться до состояния, в котором удаление выполнено, но вставка отсутствует. –

+0

@MikeMiller И в этом случае процедура просто откат, а не исключение? –

+0

Если задано неверно, процесс должен вызвать исключение и откат только вставки. –

ответ

1

Можете ли вы, пожалуйста, посмотрите на ответ ГБН в шаблон транзакции Nested stored procedures containing TRY CATCH ROLLBACK pattern?

Основываясь на вас вопрос, я изменил процедуру возврата -1, когда происходит откат.

CREATE PROCEDURE [Name] 
    @arg1 as nvarchar(20), 
    @arg2 as nvarchar(20) 
AS 
    SET XACT_ABORT, NOCOUNT ON 

    DECLARE @starttrancount int 

    BEGIN TRY 
     SELECT @starttrancount = @@TRANCOUNT 

     IF @starttrancount = 0 
      BEGIN TRANSACTION 

     delete from tblA where f1 = @arg1 ... ; 
     insert into tblB (a) select ... where f2 = @arg2 ... ; 

     IF @starttrancount = 0 
      COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
     IF XACT_STATE() <> 0 AND @starttrancount = 0 
     BEGIN 
      ROLLBACK TRANSACTION 
      RETURN -1 
     END 
    END CATCH 
    GO 
+0

- это то, что сработало Giosco ?? – sundar

+0

Возможно, есть недоразумение. Я хочу сохранить свою процедуру такой, какой она есть. Я называю это с помощью ExecuteNonQuery(). Я просто хотел знать, если в этом созвездии МОЖНО произойти, что ExecuteNonQuery() вернет -1, не выбрасывая исключение. –

+0

Да, я надеюсь. , потому что если никакие строки не пострадали, он вернет -1. Для операторов UPDATE, INSERT и DELETE возвращаемое значение представляет собой количество строк, на которые влияет команда. Когда триггер существует в вставленной или обновляемой таблице, возвращаемое значение включает в себя количество строк, затронутых как операцией вставки, так и обновлением, а также количеством строк, затронутых триггером или триггерами. Для всех других типов операторов возвращаемое значение равно -1. Если происходит откат, возвращаемое значение равно -1. Источник: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx – sundar

Смежные вопросы