Странное поведение кода внутри TransactionScope? - PullRequest
1 голос
/ 26 марта 2010

Мы столкнулись с очень сложной проблемой в нашем производственном приложении.

  1. У нас есть метод WCF, который создает сложную сущность в базе данных со всеми ее связями.

    public void InsertEntity(Entity entity)
    {
       using(TransactionScope scope = new TransactionScope())
       {
           EntityDao.Create(entity);
       }    
    }
    
  2. Метод EntityDao.Create (entity) очень сложен и содержит огромные кусочки логики. В течение всего процесса создания он создает несколько дочерних объектов, а также имеет несколько запросов к базе данных.

  3. В течение всего запроса WCF о создании объекта обычно Connection поддерживается в переменной ThreadStatic и повторно используется DAO. Хотя некоторые из запросов в DAO, описанных в шаге 2, используют новое соединение и закрывают его после использования.

В целом мы видели, что описанное выше поведение процесса является непредсказуемым. Некоторые из запросов во внутреннем DAO даже не возвращают фактические данные из базы данных? Тот же запрос при запуске в хранилище данных Actaul дает правильный результат.

Какая может быть возможная причина такого поведения?

1 Ответ

0 голосов
/ 18 мая 2011

ThreadStatic не рекомендуется. Вместо этого используйте CallContext. У меня есть код на http://code.google.com/p/softwareishardwork/, который демонстрирует правильный способ обработки соединений описанным вами способом (протестировано в серьезных высокопроизводительных сценариях). Попробуйте тестовый пример, используя этот код.

...