Как я могу заставить TransactionScope использовать одно и то же соединение через вызовы базы данных? - PullRequest
0 голосов
/ 27 июля 2010

Доброе утро всем,

У меня есть код, подобный следующему

try{
    using(var tx = new TransactionScope()){

        var Xupdated  = someDao.DoSomeUpdateQuery(); //this dao uses MS Data ApplicationBlock

        var Yupdated = someDao.DoSomeOtherUpdateQuery(); //this dao also uses MS Data ApplicationBlock

     if(Xupdated && Yupdated)
     {
        tx.Complete();
     }

    }
} catch(Exception ex){

   DoSomethingWithTheException();
}

У методов дао есть код, подобный этому

 try{
 var db = DatabaseFactory.CreateDatabase();
 var cmd = db.GetStoredProcCommand(someSP);
  var retVal = db.ExecuteNonQuery(cmd);
 return (retVal > 0);
} catch (SqlException ex){
    CustomException custom = new CustomException(ex.Message, ex);
  throw custom;

}

Проблема здесь в том, что когда Yupdated возвращает false, я хочу, чтобы DoSomeUpdateQuery () откатывался.К сожалению, изменения DoSomeUpdateQuery () зафиксированы.Как я могу исправить это?Я ставлю точку останова и tx.Complete () никогда не вызывается.Кто-нибудь знает, как я могу получить соответствующее желаемое поведение здесь?Заранее спасибо за любые указатели.

Приветствия,
~ CK в Сан-Диего

1 Ответ

0 голосов
/ 27 июля 2010

У вас уже есть соответствующее поведение, пока класс DatabaseFactory ведет себя взаимодействующим образом.Если кажется, что вызовы someDao действуют независимо, это может означать, что они активно создают внутреннюю область с помощью TranscationScopeOption.Supress .Другая проблема может быть, если вызов CreateDatabase внутренне кэширует некоторый SqlConnection и не зависит от пула соединений SqlClient, таким образом возможно пропуская регистрацию соединения в транзакцию.

В качестве примечания, даже если это работает должным образом, это будет очень неэффективно, потому что вы зарегистрируете два отдельных соединения в распределенной транзакции, и это замедлит обработку отличной сделки,Хороший уровень доступа к данным принимает Sqlconnection для использования в качестве параметра, чтобы он мог совместно использовать его между вызовами, сохраняя таким образом объем транзакции local на сервере.

...