2015-04-17 1 views
1

Я использую TransactionScope в своем коде C#. Я постараюсь как можно больше упростить.TransactionScope и транзакции, включенные в вложенные хранимые процедуры

public void ProcessStrings(...) 
{ 
    ... 
    using (TransactionScope transactionScope = new TransactionScope()) 
    { 
     ... 
     if(someCondition) 
     { 
      try 
      { 
       DeleteSomeStrings(...); 
      } 
      catch(Exception ex) 
      { 
       //log error 
       ... 
       throw; 
      } 
     } 

     ... 

     try 
     { 
      UpdateSomeStrings(...); 
     } 
     catch(Exception ex) 
     { 
      //log error 
      ... 
      throw; 
     } 

     ... 

     transactionScope.Complete(); 
    } 
    ... 
} 

В DeleteSomeStrings и UpdateSomeStrings методы вызывают два хранимых процедур через ADO.NET. Мне нужно использовать явную обработку транзакции в этих хранимых процедур, а также потому, что они также вызываются из других контекстов:

CREATE PROCEDURE [dbo].[DeleteSomeStrings] 
... 
--parameter list 
... 
AS 
BEGIN TRY 

    BEGIN TRAN 
    ... 
    COMMIT TRAN 
END TRY 

BEGIN CATCH 
    ... 
    ROLLBACK 
    ... 
    RAISERROR(...) 
END CATCH 

и второй из них имеет сходную структуру:

CREATE PROCEDURE [dbo].[UpdateSomeStrings] 
... 
--parameter list 
... 
AS 
BEGIN TRY 

    BEGIN TRAN 
    ... 
    COMMIT TRAN 
END TRY 

BEGIN CATCH 
    ... 
    ROLLBACK 
    ... 
    RAISERROR(...) 
END CATCH 

Проблема заключается в том, когда DeleteSomeStrings преуспевает, а UpdateSomeStrings завершается с ошибкой, данные, обработанные в DeleteSomeStrings, все еще фиксируются. Похоже, что TransactionScope игнорируется в этом сценарии. Я бы ожидал, что все будет отменено. Это нормальное поведение, и если да, то почему?

+0

Когда вы выполняете первую хранимую процедуру, попробуйте использовать 'rowsAffected = cmd.ExecuteNonQuery();' if rowsAffexted is Zero, никакая точка в выполнении второго SP – user2526236

+0

не просматривает это сообщение: http: // stackoverflow. ком/вопросы/15431285/вызов несколько SQL-сервер сохраненного-процедура-в-операции – fabricio

ответ

0

Управляемый, чтобы получить его работу с помощью SqlTransaction вместо TransactionScope и передавая ту же связь и транзакции к объектам команд, которые были использованы для выполнения двух хранимых процедур. Это швы TransactionScope не может использоваться в этом сценарии. Спасибо за ваши комментарии.

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