我正在更新當前在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();
}
所有這些功能只是格式化數據和發送參數,在數據庫上的數據庫進行選擇/插入/更新操作的存儲過程。
SaveCustomer存儲過程將客戶保存到新數據庫。
SaveCorporateOrder存儲過程獲取由保存客戶存儲過程寫入的信息,並使用它將訂單保存到新數據庫中。
ExportOrder存儲過程獲取由前兩者寫入的信息並將訂單導出到舊數據庫。
這些存儲過程中的每一個都包含在@@ TRANCOUNT == 0時啓動新事務並在末尾具有提交語句的代碼。由於C#中的事務處理似乎沒有使用這些事務,但沒有將事務信息或連接信息傳遞給我可以看到的存儲過程的代碼。這在SQL 2005服務器上正在使用和使用中。
當我嘗試建立這個並使用它使用SQL 2008 R2我的開發環境,我得到這樣的錯誤
"Uncommittable transaction is detected at the end of the batch"
和
"The server failed to resume the transaction"
看來,每一個開始它自己的事務,並且無法從先前未提交的事務讀取數據,而不是看到它處於同一事務中。我不知道如果不同的SQL版本可能會導致這種情況的工作方式不同,但完全相同的代碼在Live安裝中工作,但不在我的Dev環境中工作。
任何想法,甚至方向在哪裏看下一個將是驚心動魄!
謝謝! -Jacob
我已經檢查了SQL查詢,並且每個中的邏輯都包含在一個帶有回滾調用的Try塊中。在整個程序中,沒有一個C#方法具有回滾調用,但這些事務正在回滾,所以我假設在TransactionManager中內置了一段時間的自動回滾。 – 2013-03-08 13:59:11