TransactionScope не выполняет откат внутри метода службы wcf, выполняет откат при непосредственном вызове - PullRequest
7 голосов
/ 05 марта 2012

Я столкнулся с проблемой, которая сводит меня с ума на пару дней в надежде, что кто-то может мне помочь.Вот оно;

Я использую EF4 с базой данных oracle, используя dotConnect для oracle из devart в качестве провайдера.У меня есть метод службы wcf, который вызывает метод DeleteCabinet ниже;

public void DeleteCabinet(string pRID)
{
    using(TransactionScope tranScope = new TransactionScope())
    {
        DBUtils.DeleteCabinetAndShelves(pRecordId);

        //throw exception to test record not deleted
        throw new Exception("xxx something has happened test xxx");

        tranScope.Complete();
    }
}

DBUtils.DeleteCabinetAndShelves выглядит следующим образом:

public void DeleteCabinetAndShelves(string pRecordId)
{
    using(var context = new EdrmEntities())
    {
        var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID);

        //mark all cabinet shelves for deletion
        if (cabinet.Shelves != null)
        {
            foreach (var tempShelf in cabinet.Shelves.ToList())
            {
                context.DeleteObject(tempShelf);
            }
        }

        //mark cabinet for deletion
        context.DeleteObject(cabinet);

        //save 
        context.SaveChanges();
    }
}

, когда я вызываю DeleteCabinet из моего тестового проекта, а не вызов wcfно прямой вызов метода работает нормально.Выдает исключение, и транзакция откатывается.Таким образом, ни одна запись не удаляется из БД, как ожидалось

Проблема заключается в том, что когда я вызываю сервисный метод (который вызывает DeleteCabinet) из клиента, генерируется исключение, но запись удаляется из БД.Транзакция не откатывается!

похоже, что вызов метода wcf не откатывает транзакцию, но это кажется сумасшедшим (по крайней мере, мне), кто-нибудь знает причину, по которой это может происходить?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Вы пометили свой пост тегами DevArt и DotConnect ... Интересно, является ли это ошибкой в ​​поставщиках DevArt, а не чем-то присущим WCF / Entity Framework / System.Transactions. Вы можете проверить теорию, посмотрев, происходит ли это с ObjectContext, использующим встроенный поставщик SQL Server (или даже с собственным EF-провайдером Oracle , который был недавно выпущен) и посмотреть, по-прежнему ли возникает проблема , Это единственное, о чем я могу думать, так как код кажется на 100% правильным.

1 голос
/ 07 марта 2012

Благодаря конструктивным комментариям @Rabid и @luksans проблема решена, и оказалось, что она не имеет ничего общего с ошибками провайдера wcf или devart

Вот в чем дело;Сервис wcf (который не выполнял откат) и тест интеграции (который делал) находятся внутри разных проектов, поэтому файлы конфигурации различны.Они когда-то вышли из синхронизации, и разница в Enlist=false части.Таким образом, строка подключения проекта wcf имеет Enlist=false, а тестовый проект - нет.Так родилась иллюзия неудачной транзакции WCF.

Удаление Enlist=false из строки подключения проекта wcf решило проблему.

...