Проблема в области транзакции внутри WCF

В моем проекте DAL - это служба WCF .Net4.0. с использованием базы данных oracle 11g. Я использую область транзакции в WCF (на стороне сервера). Мне нужно вызвать более одной хранимой процедуры внутри метода (контракта операции), если какой-либо sp не удалось, мне нужно откатить уже выполненный sp. Но отката не произошло. Я не использую поток транзакций на стороне клиента.

Я разместил образец кода

общедоступный класс Service: IService {

public bool Method1()
    {
        using (TransactionScope Scope1 = new TransactionScope())
        {
            Method2();
            Method3();
            Scope1.Complete();
        }
        return true;
    }

    public bool Method2()
    {
        using (TransactionScope Scope2 = new TransactionScope())
        {
            // Procedure call .....
            Scope2.Complete();
        }
        return true;
    }

    public bool Method3()
    {
        using (TransactionScope Scope3 = new TransactionScope())
        {
            // Procedure call .....
            Scope3.Complete();
        }
        return true;
    }

}


person Karthikeyan    schedule 17.06.2011    source источник
comment
не могли бы вы опубликовать свой код   -  person Shiraz Bhaiji    schedule 17.06.2011


Ответы (1)


Я не вижу причин, по которым это не сработает так, как ожидалось, в том виде, в каком у вас там выложен ваш код.

Однако, если вы используете WCF, вы можете рассмотреть возможность использования встроенного в WCF материала потока транзакций. Таким образом можно объединить весь вызов WCF в одну транзакцию, не создавая вручную области TransactionScopes и не управляя ими. Поток транзакции WCF может быть настроен так, чтобы требовать транзакцию на стороне службы, поэтому WCF запустит транзакцию за вас, если клиент ее не передаст. Таким образом, вам вообще не придется редактировать своего клиента. http://msdn.microsoft.com/en-us/library/ms751413.aspx

person CodingWithSpike    schedule 17.06.2011
comment
Насколько я понимаю, WCF не является фактором, поскольку транзакция выполняется на стороне службы, транзакция не проходит между клиентом и сервером. Задумывались ли вы о профилировании SQL, чтобы увидеть, когда на сервере выполняются вызовы начала / завершения транзакции? - person Rich; 17.06.2011
comment
@Rich - Я согласен с тем, что WCF на самом деле здесь не фактор, однако он сказал, что использует его, поэтому я рекомендовал вместо этого использовать поток транзакции, просто потому, что тогда вы можете положиться на WCF для создания 1 области транзакции самостоятельно, а не вручную настраивая каждый из них, беспокоясь об их вложении и вызывая Complete. Подход с ручной настройкой определенно более подвержен ошибкам. Отслеживание начала / завершения транзакции тоже определенно хорошая идея. - person CodingWithSpike; 17.06.2011