【发布时间】:2011-08-19 16:47:32
【问题描述】:
我在 MSDN 中阅读了有关 MessageQueueTransaction 的信息,但我找不到有关超时的任何信息。如果 Commit 或 Abort 从未被调用会发生什么?事务在打开和释放之间是否存在某种超时?
【问题讨论】:
标签: .net transactions timeout msmq
我在 MSDN 中阅读了有关 MessageQueueTransaction 的信息,但我找不到有关超时的任何信息。如果 Commit 或 Abort 从未被调用会发生什么?事务在打开和释放之间是否存在某种超时?
【问题讨论】:
标签: .net transactions timeout msmq
这是一个内部事务,因此不涉及 MSDTC(确实有超时)。 我相信事务将一直存在,直到您的应用程序调用提交或中止。 如果应用程序失败或没有调用就退出,那么我希望 MSMQ 会为您中止事务。
您有具体问题还是只是好奇?
干杯
约翰·布雷克韦尔
【讨论】:
谢谢约翰!我刚刚创建了一个 WCF 服务,它从 MSMQ 接收消息并将它们传输回远程客户端。客户端可以请求 x 条消息。
客户端首先调用服务启动事务。 该服务将其堆叠在一个带有 GUID 的集合中。该 guid 被发送回客户端,客户端将使用它来调用服务。因此,服务可以找到相应的事务并将其与 Receive() 一起使用。
客户端完成所有工作后,它调用 Terminate(bool commit) 方法,其 GUID 调用事务上的 Commit 或 Abort。但是,如果由于客户端崩溃或网络中断而从未调用 Commit 或 Abort 怎么办?这是我的担心...
我这样做基本上是因为 MSMQ 3 不支持远程事务(仅 MSMQ 4)。
【讨论】:
答案在于 MSMQ 本身的内部 ACK 消息传递。因此,要回答您的问题,毫无疑问,如果您在检索后不提交或中止使用事务的消息,它实际上会回滚。这就是处理断电事件等的方式。
在事务中发送消息时也是如此,除了取决于超时参数外,收件人未能确认收到消息可能最终导致信件进入死信队列。您可以随时重新处理这些 - 但您是否愿意取决于您正在构建的系统类型。
---- 根据 MSDN https://msdn.microsoft.com/en-us/library/ms699870(v=vs.85).aspx
当应用程序请求肯定和否定确认消息时,可以使用有关消息发送操作最终结果的附加信息。有关请求确认消息的更多信息,请参阅确认消息。
https://msdn.microsoft.com/en-us/library/ms707129(v=vs.85).aspx
希望对您有所帮助。
【讨论】: