TransactionScope, linq и странная проблема с менеджером транзакций (HRESULT: 0x8004D024) - PullRequest
2 голосов
/ 07 апреля 2009

У меня есть методы уровня обслуживания, которые вносят несколько изменений в базу данных, и я хочу, чтобы они использовали управление транзакциями. Такие методы могут сделать следующее: - LINQ SubmitChanges () функциональность - Звонки в StoredProcedures

Пользователи компонентов могут объединять множество таких элементарных операций в нечто большее.

Я вижу, что есть хороший класс TransactinScope и пытаюсь его использовать:

using (TransactionScope transaction = new TransactionScope())
{
     content = repository.CreateBaseContent(content);
     result = repository.CreateTreeRelation(content, parent.Id, name);
     transaction.Complete();
}

public baseContent CreateBaseContent(baseContent content)
{
       EntityContext.baseContents.InsertOnSubmit(content);
       EntityContext.SubmitChanges();

       return content;
}

public CreateTreeRelation (params)
{
// do StoredProcedure call here via LINQ
}

Мое предположение состояло в том, что на внешних слоях можно было бы добавить еще один уровень объема транзакции. Вместо этого у меня появляется следующая ошибка:

Менеджер транзакций отключил поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D024)

Я использую ту же (Vista Ultimate) машину для MS SQL 2005 и сервера разработки Microsoft. Из юнит-тестов все отлично работает. То же самое, когда прокомментировал TransactionScope.

Я пытался играть с безопасностью для DTC (http://support.microsoft.com/kb/899191), и когда я настроил прием всех входящих и исходящих транзакций, у меня появляется следующее сообщение об ошибке:

Ошибка HRESULT E_FAIL возвращена после вызова COM-компонента.

Во время отладки я обнаружил, что в SubmitChanges контекст сущности Linq имеет свойство Transaction IS NULL (!!), а System.Transactions.Transaction.Current имеет открытую транзакцию

Ответы [ 2 ]

3 голосов
/ 12 апреля 2009

Я думаю, что вы также можете использовать TransactionScope, если вы передаете данные, так же как и вы .Open.

Еще одна проблема, которую вы получаете с TransactionScope, заключается в том, что ему все равно, будет ли строка подключения одинаковой, выполнение второго. Open откроет транзакцию для распределенной транзакции. И затем вам приходится иметь дело с соответствующей конфигурацией, а также с тем фактом, что она не использует легкую транзакцию, которая необходима для этого случая.

2 голосов
/ 08 апреля 2009

Проблема возникла из-за того, что Linq Datacontext был создан до транзакции.

Решением было добавить собственный контроль транзакций в текстовый текст LINQ.

Connection.Open()
Transaction = Connection.BeginTransaction();

и счетчики для поддержки вложенных вызовов.

...