我們有一個特別奇怪的問題;讓我設置場景。 發現的解決方案見下文在什麼情況下,SQL複製部分地(並且默默地)從c#應用程序的MSDTC事務中失敗
我們有三個SQL Server 2005個數據庫,爲參數的緣故叫:阿爾法,測試版和伽瑪。
有這些數據庫之間定義複製關係如下:
這三個數據庫都有一個名爲「演示。」具有相同的架構表。複製已建立,以便Alpha是提供程序,其他兩個數據庫是訂戶。
- 使用MSDTC交易(由一個TransactionScope處理)甲C#.NET 3.5應用程序是讀取和寫入到數據庫:α和β。
- 此交易中的表「AnExample」僅在Alpha上進行更新。
- MSDTC事務成功提交。
- 「演示。」表可能是更新阿爾法和變化會立即複製到伽瑪
- 上測試版(探查證實,沒有活動發生在數據庫上),也不是任何錯誤不發生變化在SQL日誌或事件日誌
- 重新運行Management Studio中更新「演示。」有相同的憑證相同的查詢成功(複製測試版發生)
- 運行MSDTC事務寫入另一個表提出在Beta版,然後使用主要應用DAL,連接字符串和配置的測試應用程序阿爾法的「演示。」表完全相同的寫操作也完全成功(複製到測試版發生)
這有使我們相信主應用程序中發生的變化並不是孤立的。
可能的線索/紅鯡魚
我們可以在我們的試驗成功,並且主要應用程序使用的是隔離級別莫名其妙地改變了實際查詢之間看到的唯一區別。在成功查詢時,它將事務隔離級別設置爲僅讀取提交,而在失敗場景中將其設置爲可序列化(儘管沒有顯式調用來更改代碼庫或存儲過程中的隔離級別)。
我們確實認爲這是一種紅鯡魚,因爲在Management Studio中使用此隔離級別運行查詢後,問題再次成功。但是,這可能是我們尚未發現的另一個問題的症狀,這是不同的觀點。
爲了完整起見,此處查詢的設置無法複製到Beta(但對Gamma有影響)。
-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level *serializable*
這是一個頭疼的人。
它可能是無關的,但嘗試看看這一個:http://stackoverflow.com/questions/195420/transactionscope-bug-in-net-more-information – 2009-04-30 15:04:33
謝謝你的建議 - 我們看着它,但在結束它沒有區別 – Lex 2009-05-07 09:36:22