Функции TransactionScope - PullRequest
       15

Функции TransactionScope

1 голос
/ 19 августа 2011

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

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

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.Указатели в правильном направлении будут с благодарностью.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

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

Обратите внимание, что Уровень изоляции TransactionScope по умолчанию - Read Serializable - это может привести к блокировке / взаимоблокировке.

0 голосов
/ 19 августа 2011

Вы можете рассмотреть возможность использования Dependency Injection для обхода одного и того же ObjectContext, чтобы избежать TransactionScope.

Вместо создания Context внутри репозитория, внедрить его через конструктор.

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

}

Взгляните на этот ответ

...