2013-03-06 57 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(); 
} 

所有這些功能只是格式化數據和發送參數,在數據庫上的數據庫進行選擇/插入/更新操作的存儲過程。

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

回答

0

我認爲這個問題是因爲交易失敗並且沒有被拒絕。當任何SQL查詢失敗時,您都沒有回滾的情況。你檢查過這些查詢嗎?

+0

我已經檢查了SQL查詢,並且每個中的邏輯都包含在一個帶有回滾調用的Try塊中。在整個程序中,沒有一個C#方法具有回滾調用,但這些事務正在回滾,所以我假設在TransactionManager中內置了一段時間的自動回滾。 – 2013-03-08 13:59:11