對於我的C#.Net MSMQ應用程序(使用System.Messaging),我想執行插入到oracle數據庫作爲事務。我將讀取的隊列是另一個服務將寫入的本地專用隊列。在提交和接收之前偷看到MSMQ
我正在考慮使用Peek方法先抓取並插入數據。如果db插入沒有發生異常或問題,那麼我會調用Receive從隊列中刪除消息。
我知道有TransactionScope功能,但執行我的操作是否有任何缺點如上所述?
對於我的C#.Net MSMQ應用程序(使用System.Messaging),我想執行插入到oracle數據庫作爲事務。我將讀取的隊列是另一個服務將寫入的本地專用隊列。在提交和接收之前偷看到MSMQ
我正在考慮使用Peek方法先抓取並插入數據。如果db插入沒有發生異常或問題,那麼我會調用Receive從隊列中刪除消息。
我知道有TransactionScope功能,但執行我的操作是否有任何缺點如上所述?
是的,有。其他人理論上可以在您插入數據庫時抓取該消息。首選的方法是使用兩個單獨的事務,其中一個用於接收消息,另一個用於數據庫調用(如果需要)。如果數據庫調用失敗,您將回滾接收事務。
因此,在僞代碼將是這樣的:
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
我不建議你使用同一事務的兩個動作是可以有一些副作用,然後你不會是在完全控制工作流程。
這將是一個本地(私人)隊列,我會更新我的問題來澄清這一點。 – 2012-03-26 17:20:43
本地隊列的原理相同。 – 2012-03-26 21:48:42
感謝您的信息,我正在考慮實施這一點。但是,出於信息的目的,如果我完全控制本地隊列,並且只實現一個單線程接收器,以便在執行db插入時沒有其他人能夠獲取我的消息,您是否認爲上述這種方法仍然是首選? – 2012-03-26 20:28:15
當然,您可以使用peek實現它,然後在db插入後接收,但是如果使用我提出的模式,則會有一個更持久的解決方案,可以輕鬆地在其他場景中重用,並且從架構角度來看也更加正確。 – 2012-03-27 11:36:58