2011-07-20 76 views
3

我正在使用MSMQ端點。 我在我的服務上設置了以下屬性。禁用WCF(MSMQ)服務中的DTC

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
public void MyMethod(MyParam param) { ... } 

在接口上我有

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, ReleaseServiceInstanceOnTransactionComplete = true)] 

我有做的更新到SQL Server數據庫和MSDTC,總是使用與交易促進的方法。

我該如何抑制這一點。如何連接到MSMQ事務處理完全SEPARATE事務中的sql server。我只想要一個sql事務,而不是DTC事務。有沒有辦法確保sql事務不包含在MSMQ事務的範圍內。

我希望我可以做到這一點,而不會完全移除MSMQ上的交易,這正是我正在考慮的。

問候

克雷格

+0

DTC事務將MSMQ和SQL更新保持在一起。如果將事務分開,則不能保證MSMQ消息將用於更新SQL。您仍然可以獲得可靠的MSMQ消息,但從消息中提取的數據不受保護。如果在讀取消息和寫入數據庫之間出現錯誤,您將無法恢復。 –

回答

6

你抱怨事務MSMQ的核心含義。事務性MSMQ使用事務性讀取和寫入隊列。因此,您的消息將在事務中讀取,並且如果讀取/處理失敗,則讀取將回滾並且消息不會從隊列中刪除。通過用TransactionScopeRequired標記您的操作,您告訴WCF your operation is part of message's transactional processing。如果您的數據庫操作失敗,它也會使MSMQ讀取失敗,並且您的消息不會丟失。如果您在操作中打開數據庫連接,則事務將被提升爲DTC,因爲您在單個事務中有兩個事務資源。

所以,如果你不想這個機制不使用事務性隊列,但仔細想一想。關閉事務隊列的原因應該是你並不需要它而不是你不想分佈式事務。

+0

DTC的問題是,我發現它的越野車和慢。 – Jim

+4

很遺憾,我正在更新隊列處理中的數據庫。如果我使用文件io或其他機制,我可以保持一致性。對於讀取此內容的其他人,請注意,您實際上可以使用新的TransactionScope(TransactionScopeOption.Suppress)來抑制隊列方法內的事務,這將允許您在沒有事務的情況下更新數據庫。 – Jim