XACT_ABORT в TransactionScope для простой обработки ошибок - PullRequest
1 голос
/ 01 октября 2009

Этот вопрос является попыткой изучить семантику, связанную с взаимодействием между TransactionScope и xact_abort в SQL Server 2000.

Если следующий SQL-файл выполняется в TransactionScope, и ошибки первой команды удаления будут выполнены, будет ли выполняться вторая команда удаления? (Примите внешний ключ от родителя к ребенку для обеспечения сбоя.)

create procedure test
    @id int
as
set xact_abort on
-- no explicit transaction is created

-- if this fails
delete from dbo.[parentTable]
where id = @id

-- will this run?
delete from dbo.[childTable]
where id = @id

Предполагая тривиальный код приложения, как показано ниже:

public bool TryTestStoredProcedure()
{
    try 
    {
        using (TransactionScope t = new TransactionScope())
        {
            MethodThatRunsTestStoredProcedure();
            t.Complete();
            return true;
        }
    }
    catch
    {
        return false;
    }
}

Что будет возвращаемым значением этого метода, если первый оператор удаления в хранимой процедуре завершится неудачно? А что если второй оператор delete не сработает?

1 Ответ

1 голос
/ 01 октября 2009

После некоторого тестирования, основанного на моем собственном псевдо-тестовом коде, приведенном выше, похоже, что единственное различие между использованием XACTABORT и не в TransactionScope состоит в том, что, если proc использует XACTABORT, он завершается неудачно (для ошибок, которые XACTABORT ловит ), чем, если процесс не использует XACTABORT. TransactionScope, по-видимому, перехватывает исключения, которые возникают в любой точке во время выполнения в пределах его области действия, даже если после возникновения этих исключений произошли другие операции.

Для хранимой процедуры с включенным XACTABORT никаких изменений не наблюдалось после первого сбоя, а когда XACTABORT был выключен, наблюдались изменения из второго оператора. Однако в обоих случаях TransactionScope не завершился, но выдал исключение.

Итак, быстрые ответы на мои вопросы:

  • Если XACTABORT включен, второй оператор удаления не будет выполняться
  • Если XACTABORT выключен, будет выполнен второй оператор удаления (и любой последующий код)
  • Если во время выполнения хранимой процедуры возникла исключительная ситуация, возвращаемое значение для метода будет ложным
...