【问题标题】:What happens when an MSMQ transaction isn't commited/aborted?当 MSMQ 事务未提交/中止时会发生什么?
【发布时间】:2014-10-04 14:13:39
【问题描述】:

假设我有一个事务队列。

var msgQ = MessageQueue.Create(@".\$private\Orders", True)
msgQ.DefaultPropertiesToSend.Recoverable = true;

现在说我去消费队列外的消息...

var msgTx = New MessageQueueTransaction();
msgTx.Begin();
var msg = msgQ.Receive(msgTx)

... 然后机器在提交或中止发生之前停机。

我尝试接收的消息会怎样?

【问题讨论】:

    标签: transactions msmq


    【解决方案1】:

    the documentation for Receive中所述:

    因为这个方法是在事务队列上调用的,所以消息 如果事务是收到的将被返回到队列中 中止。该消息不会从队列中永久删除,直到 事务已提交。

    【讨论】:

    • 如果提交/中止从未真正发生怎么办?是否基于某些标准隐式中止?如果是这样,这些标准是什么(或者我在哪里可以找到文档)?
    • 事务将超时。似乎没有任何文档,@JohnBreakwell's answerthis question 暗示了它。
    • MSMQ 应该检测到应用程序已经消失,并通过将消息恢复到队列中的原始状态来进行清理。非事务性消息将被销毁。
    • @JohnBreakwell,这是基于超时、心跳还是其他机制?它是可配置的吗?感谢您的参与。
    • 好问题,但我没有答案。我的档案中可能有一些东西可以解释 MSMQ 如何知道但没有承诺。
    猜你喜欢
    • 2010-12-05
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多