在提交和接收之前窥视MSMQ

时间:2012-03-23 16:49:34

标签: oracle transactions msmq

对于我的C#.Net MSMQ应用程序(使用System.Messaging),我想作为事务执行插入oracle db。我将读取的队列是另一个服务将写入的本地专用队列。

我正在考虑使用Peek方法首先抓取并插入数据。如果db insert没有出现异常或问题,那么我将调用Receive来从队列中删除该消息。

我知道有TransactionScope功能,但是如上所述,执行我的操作有任何缺点吗?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分: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

我不建议您对这两个操作使用相同的事务,因为可能会有一些副作用,您将无法完全控制工作流。