2012-03-23 32 views
0

對於我的C#.Net MSMQ應用程序(使用System.Messaging),我想執行插入到oracle數據庫作爲事務。我將讀取的隊列是另一個服務將寫入的本地專用隊列。在提交和接收之前偷看到MSMQ

我正在考慮使用Peek方法先抓取並插入數據。如果db插入沒有發生異常或問題,那麼我會調用Receive從隊列中刪除消息。

我知道有TransactionScope功能,但執行我的操作是否有任何缺點如上所述?

回答

0

是的,有。其他人理論上可以在您插入數據庫時​​抓取該消息。首選的方法是使用兩個單獨的事務,其中一個用於接收消息,另一個用於數據庫調用(如果需要)。如果數據庫調用失敗,您將回滾接收事務。

因此,在僞代碼將是這樣的:

Initiate receive transaction 

    Receive message // Message will not be displayed in the queue, but it is still there 

    Initiate DB transaction 

     Insert data 

     Commit DB transaction // Message will be removed from the queue 

    Commit receive transaction 

Catch exception 

    Rollback DB transaction 

    Rollback receive transaction // Message will be visible in the queue again 

我不建議你使用同一事務的兩個動作是可以有一些副作用,然後你不會是在完全控制工作流程。

+0

感謝您的信息,我正在考慮實施這一點。但是,出於信息的目的,如果我完全控制本地隊列,並且只實現一個單線程接收器,以便在執行db插入時沒有其他人能夠獲取我的消息,您是否認爲上述這種方法仍然是首選? – 2012-03-26 20:28:15

+0

當然,您可以使用peek實現它,然後在db插入後接收,但是如果使用我提出的模式,則會有一個更持久的解決方案,可以輕鬆地在其他場景中重用,並且從架構角度來看也更加正確。 – 2012-03-27 11:36:58