Простые транзакции - PullRequest
       42

Простые транзакции

2 голосов
/ 20 августа 2010

У меня есть 2 оператора SQL linq 2, которые я хотел бы участвовать в транзакции (сервер SQL является удаленным, вне брандмауэров и т. Д.), Все другие коммуникации работают, но когда я обертываю эти 2 оператора в TransactionScope (), мне приходится настроить MSDTC, что мы и сделали, но есть проблемы с брандмауэром (я думаю), есть ли более простой способ?

основы того, что я хочу сделать, сводятся к следующему: (оба хранятся под капотом)

using (var transactionScope = new TransactionScope())
{
    Repository.DataContext.SubmitChanges();
    Repository.DataContext.spDoFinalStuff(tempID, ref finalId);
    transactionScope.Complete();
}

Какой самый простой способ добиться этого?

EDIT:
Сначала я получил это: Менеджер транзакций отключил поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D024) На наших серверах я следовал инструкциям здесь , чтобы исправить это. Однако инструкции, похоже, не относятся к Windows 7 (мой блок разработчика), см. Мой комментарий к ответу выше.

после исправления проблемы (на блоках, не относящихся к win7), я получаю следующее: транзакция уже была явно или неявно зафиксирована или прервана (исключение из HRESULT: 0x8004D00E), которую, как предположил , предположил , может быть проблема брандмауэра .

EDIT
Я только что обнаружил, что удаленная БД - это SQL 2000

Ответы [ 4 ]

0 голосов
/ 20 августа 2010

Когда вам нужно обработать только одну базу данных во время транзакции, вы можете просто создать и открыть новую SqlConnection. Это предотвращает необходимость использования TransactionScope. Вот пример:

using (var con = new SqlConnection("constr"))
{
    con.Open();
    using (var tran = con.BeginTransaction())
    {
        using (var context = new YourDataContext(con))
        {
            // Do stuff
            context.SubmitChanges();
            int generatedId = /* get this id */
            // Do stuff with id

            context.SubmitChanges();
        }
    }
}

Поскольку вы используете Repository, вам придется создать контекст на фоне, но идея та же. И не забудьте утилизировать транзакцию базы данных и соединение.

0 голосов
/ 20 августа 2010

Вы всегда можете создать новую хранимую процедуру, которая выполняет эти два SP в своей собственной транзакции? Быстро и грязно ...

0 голосов
/ 20 августа 2010

TransactionScope - это путь, если вы не хотите возиться с SQL.Я не знаком с выполнением транзакций через брандмауэр и с какими-либо проблемами.Можете ли вы опубликовать, какие исключения / ошибки вы встречаете?

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

0 голосов
/ 20 августа 2010

если 2 обновления отправляются в 2 разные базы данных, классу .net transactoinScope нужна помощь MSDTC для координации транзакций. SQL Server 2005 или более поздней версии, если два обновления находятся в одной базе данных, MSDTC не используется.

MSDTC настраиваются в com + компонентном сервисе, выбирают имя вашего компьютера и выбирают свойства, в основном вы должны выбрать Без аутентификации.

следующая ссылка может помочь

http://support.microsoft.com/kb/306843

http://blogs.msdn.com/b/distributedservices/archive/2008/11/12/troubleshooting-msdtc-issues-with-the-dtcping-tool.aspx

...