2012-03-23 51 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