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