2013-03-06 2 views
0

Я обновляю текущую программу, которая работает и используется в среде Live, она сохраняет Клиенты и Заказы, а затем экспортирует их в старую базу данных. Вся отчетность по-прежнему выполняется в старой системе, в то время как система отчетности в новой системе находится в разработке, поэтому все они должны быть экспортированы.Проблема с дублированием функциональных возможностей транзакции

Эта программа имеет встроенный C# TransactionManager, который используется для группировки нескольких вызовов с C# на SQL в рамках одной транзакции. Всякий раз, когда я пытаюсь дублировать это, я получаю ошибки и не могу заставить его работать.

Вот код, который находится в месте, работая:

using (ITransactionInfo trx = this.TransactionManager.BeginTransaction()) 
{ 
    // 
    // Update the customer. If the customer doesn't exist, then create a new one. 
    // 
    this.SaveCustomer(Order); 

    // 
    // Save the Order. 
    // 
    this.Store.SaveCorporateOrder(Order, ServiceContext.UserId); 

    // 
    // Save the Order notes and the customer notes. 
    // 
    this.NotesService.AppendNotes(NoteObjectTypes.CorporateOrder, Order.Id, Order.OrderNotes); 
    this.NotesService.AppendNotes(NoteObjectTypes.Customer, Order.Customer.Id, Order.CustomerNotes); 

    // 
    // Export the Order if it's new. 
    // 
    this.ExportOrder(Order, lastSavedVersion); 

    // 
    // Commit the transaction. 
    // 
    trx.Commit(); 
} 

Все эти функции просто форматировать данные и отправить параметры хранимых процедур в БД, которые выполняют операции Select/Insert/Update на БД ,

Хранимая процедура SaveCustomer сохраняет клиента в новой базе данных.

Хранимая процедура SaveCorporateOrder получает информацию, которая была записана хранимой процедурой Save Customer и использует ее для сохранения заказа в новой базе данных.

Хранимая процедура ExportOrder получает информацию, которая была написана обоими предыдущими и экспортирует заказ в старую базу данных.

Каждая из этих хранимых процедур содержит код, который запускает новую транзакцию, если @@ TRANCOUNT == 0 и в конце имеет инструкцию фиксации. Похоже, что ни одна из них не используется из-за транзакции на C#, но нет кода, который передает информацию о транзакции или информацию о соединении в хранимые процедуры, которые я могу видеть. Это работает и используется на сервере SQL 2005.

Когда я пытаюсь построить это и использовать его на моей среде разработки, которая использует SQL 2008R2, я получаю ошибки как

"Uncommittable transaction is detected at the end of the batch" 

и

"The server failed to resume the transaction" 

Оказывается, что каждый из них начинает свою собственную и не может прочитать данные из предыдущей незавершенной транзакции, а не видеть, что она находится в одной транзакции. Я не знаю, может ли другая версия SQL заставлять это работать по-другому или нет, но тот же самый код работает в Live install, но не в моей среде Dev.

Любые идеи, или даже направление, где искать следующий, было бы замечательно!

Спасибо! -Jacob

ответ

0

Я думаю, что проблема в том, что транзакция терпит неудачу и не отклоняется. У вас нет отката для вызова ситуации, когда какой-либо SQL-запрос терпит неудачу. Вы проверили эти запросы?

+0

Я проверил SQL-запросы, и каждая логика была завершена в блок Try с помощью вызова Rollback в Catch. Ни один из методов C# не имеет обратного вызова во всей программе, но эти транзакции возвращаются, поэтому я предполагаю, что в TransactionManager есть время автоматического отката. –

Смежные вопросы