对于我的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