.net 原子性:数据库事务和Windows Azure 背景
有一个消息队列域。此域可能与某些消息队列技术配合使用。在这种特殊情况下,它绑定到WindowsAzure服务总线 某些项目具有注册Windows Azure服务总线主题(基本上是消息队列)的操作 注册新消息队列意味着:.net 原子性:数据库事务和Windows Azure 背景,.net,azure,distributed-transactions,c#-5.0,.net,Azure,Distributed Transactions,C# 5.0,有一个消息队列域。此域可能与某些消息队列技术配合使用。在这种特殊情况下,它绑定到WindowsAzure服务总线 某些项目具有注册Windows Azure服务总线主题(基本上是消息队列)的操作 注册新消息队列意味着: 启动域事务(即数据库事务) 添加带有一些相关信息的消息队列域对象(例如,哪个用户注册了它,或者整个消息队列属于哪个应用程序) 使用控制反转来处理消息队列服务器中的实际队列注册(在这种情况下,它将针对WindowsAzure服务总线) 若并没有任何问题,域事务将被提交,关联的域对象
您可以通过使用状态来解决此问题,而无需进行事务处理。设想以下工作流:
- 如果域挂起但主题存在,请将状态设置为“活动”(在这种情况下,步骤3可能失败)
- 如果域挂起但主题不存在,请尝试重新创建该主题或向可以手动检查正在发生的情况的人员发送警报
另一种选择可能类似于Clemens的博客文章,在SQL Azure中使用发件箱表,并在注册域的同一事务中写入该发件箱表。这是一个好的观点。我喜欢你关于各州的建议。我目前的解决方案是:1)注册队列时,在提交域事务之前执行服务总线部分;2)取消注册队列时,在服务总线部分之前执行并提交域部分。这是一个很好的保证,因为域应该始终保持一致。(在下一篇评论中继续)另外,我喜欢你的方法,因为只要想象一下域部分处于挂起状态。用户界面将有一个名为“重试”的按钮,这样可以再次使用已创建的域部件来执行Windows Azure部件。谢谢我将等待其他观点将任何答案标记为所选答案,但我将整合状态概念。