2011-08-19 5 views
0

Работа с транзакциями в .net. Был вопрос о текущих транзакциях через вспомогательные функции. Нужно ли использовать зависимые транзакции, если контекст объекта является общим для под-методов?Функции TransactionScope

Например, в следующем коде - Объявляю контекст объекта в конструкторе моего класса (не уверен, если это лучшая практика)

public class EmployeeRepository 
{ 
    private EmployeeContext ec;   
    public EmployeeRepository() 
    { 
     objectContext = new EmployeeContext();    
    }  
    public InitTransaction(EmployeeEntity emp1) 
    { 
     using (TransactionScope transaction = new TransactionScope()) 
     { 
      try 
      { ec.employees.AddObject(emp1); 
       SubFunction1(); 
       ec.SaveChanges();        
      } 
      catch 
      { 
       //catch 
      } 
     } 
     //commit the transaction here 
     ec.AcceptAllChanges(); 
    } 

    public SubFunction1() 
    { 
     //some processing 
     //using same object context 
     ec.someother.AddObject(someobject); 
     ec.SaveChanges(); 
    } 
} 

Я хочу подфункции быть частью сделок также? В этом случае я должен использовать зависимую транзакцию в SubFunction1, хотя я использую тот же контекст объекта? Или Должен ли я добавить

using (TransactionScope transaction = new TransactionScope()); 

в пределах SubFunction1. Указатели в правильном направлении были бы весьма полезны.

ответ

1

Сферы транзакций могут быть вложенными (они работают аналогично механизму SQL @@ TRANCOUNT), поэтому теоретически можно использовать TransactionScopes в вашем репозитории, например. для сохранения родительского отношения: дочерние таблицы ACID, но также и в ваших бизнес-слотах/службах (например, для распределения распределенных транзакций по нескольким объектам, возможно в нескольких Базах данных, и даже в других ресурсах, таких как очереди сообщений и Transactional file systems.

Обратите внимание, что default isolation level of TransactionScope читается Сериализуемым. - это может привести к запирающим/тупикам

+0

Теперь мой вопрос - будет ли мой код работать как -i.e. Подфункция1 будет частью транзакции, если я использую тот же контекст объекта. Должен ли я явно начать транзакцию в SubFunction1. – user275157

+1

Да - это сработает - SubFunction1 (и все, что вызвано SubFunction1), по умолчанию зачислен в ваш TransactionScope. Ресурсы, поддерживающие транзакцию, такие как * Контексты и SQLConnections будут автоматически зачисляться. – StuartLC

+0

Спасибо за ввод. Так что никаких новых транзакций в подфункции1 нет. Также на уровнях изоляции - я использую mysql и имею возможность активировать неудачные транзакции для конечного пользователя (для их повторения). Поэтому я думал, что чтение serializable будет безопасным. Должен ли я изменять уровень изоляции для чтения? – user275157

0

вы можете рассмотреть возможность использования Dependency Injection пройти примерно в том же ObjectContext, так что вы можете избежать TransactionScope

Вместо создание Context внутри. Репозиторий вводит его через const ructor.

public class EmployeeRepository 
{ 
    private EmployeeContext ec;   
    public EmployeeRepository(EmployeeContext objectContext) 
    { 
     ec = objectContext;    
    }  

} 

Посмотрите на this answer

+0

Спасибо. Код аналогичен (просто опустил его для ясности). У меня фактически есть EmployeeRepository реализовать Idisposable и утилизировать соединение. Все операционные системы выполняются в службе обслуживания wcf. – user275157

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