2013-06-10 3 views
1

я собирался через кусок кода и наткнулся на следующие:TransactionScope и WCF обратного вызова

using(var transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionScopeOptions { IsolationLevel = IsolationLevel.Snapshot }) 
    { 
     List<Task> tasks = new List<Task>(); 
     try 
     { 
      // Perform some database operation to read data (These operations are happening with a transaction scope having scopeoption as "Required" and isolationlevel as "ReadCommitted") 
      // Filter the data 
      // At this point the code already has a reference to a WCF duplex callback 
      // Create a List<Task> and a 
      foreach(var data in List<SomeData>) 
      { 
       var task = Task.Factory.StartNew(() => { 
        **(WCF Duplex Callback Instance).Process(data);** 
      }); 
      tasks.Add(task); 
     } 
     } 
     catch(Exception ex) 
     { 
     // Log exception details 
     } 

     transactionScope.Complete(); 

    } 

try 
{ 
    Task.WaitAll(tasks); 
} 
catch(AggregateException ae) 
{ 
    ae.Handle(ex => { 
     // log exception details 
     return true; 
    }); 
} 

Вопросы: Уровень изоляции

  1. Родитель сделка является «Snapshot» в то время как внутренняя база данных reads используют «ReadCommitted». Каков будет фактический уровень изоляции транзакций?

  2. Предположим, что есть две задачи. Задача 1 обрабатывает просто отлично и отправляет клиенту WCF по каналу обратного вызова. Но задача 2 вызывает исключение. Думаю, в это время все действия, выполняемые в пределах родительской транзакции, должны откат. Но я не уверен, что это означает откат набора данных, уже отправленных по каналу обратного вызова WCF, который достиг клиента.

ответ

2

1) Это зависит от того, если вы имеете в виду вложенные TransactionScope-х, то согласно MSDN вы не можете иметь их вложенными с различным уровнем изоляции:

При использовании вложенных объектов TransactionScope, все вложенные прицелы должны быть сконфигурировано для использования точно такого же уровня изоляции, если они хотят, чтобы присоединились к транзакции с внешним участием. Если вложенный TransactionScope объект пытается присоединиться к транзакции окружающей среды пока она указывает другой уровень изоляции, ArgumentException выбрасывается

Однако, если вы используете некоторые хранимые процедуры, функции или просто работает необработанный SQL вы можете явно изменить уровень изоляции и он остается установленным для этого соединения, пока он не будет явно изменен снова. Но учтите, что он не будет распространен обратно на объект TransactionScope.

2) Это означает, что все изменения, выполненные с помощью диспетчера ресурсов, будут отменены. Конечно, если вы просто запрашиваете базу данных и передаете результаты по каналу, откат отката, но если вы обновляете базу данных, например, изменения должны быть отменены в этом случае.

Надеюсь, это поможет!

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