有人可以解释在服务代理谈话组?
目前,我使用的服务代理从一个SQL服务器发送消息到另一个。 在发送服务器,我试图让他们在串行处理,在接收端进行相关的消息。 根据相关文档,交谈组似乎是这一个完美的结合,但在接收服务器上,该消息得到从发送消息时,我指定的一个分配到不同的会话组。
我在网上搜索一看,这种行为似乎意( http://social.msdn.microsoft.com/forums/en-US/sqlservicebroker/thread/baf48074-6804-43ab-844a-cb28a6dce02b/ ) ,后来我感到困惑的语法从实用性( http://msdn.microsoft.com/en-us/library/ms178624.aspx )
WAITFOR(
GET CONVERSATION GROUP @conversation_group_id FROM [dbo].[ReceiveQueue]
)
如果谈话组不从发件人和邮件具有相同会话组ID发送消息遇到不会对接收端上的同一个会话组ID,什么是上面的代码的意义呢?
会话组是用于锁定本地primitve。 会话组中的消息有没有秩序的保证,以及谈话组不跨网流动。
消息顺序由服务代理对话内保证。 因此,要保持corrleated消息的顺序处理,送他们上同一个会话。
都需要groupping一组彼此相关的其他会话的会话组。 既GET CONVERSATION GROUP
和RECEIVE
动词保证他们将锁定整个converstaion组,从而防止任何其他线程从处理相关的消息。 例如,考虑一个旅游网站。 它收到预订度假包的请求的消息。 因此,它启动与酒店预订服务的对话并发送请求到预订时,它将启动一个会话与机票预订服务,并要求旅游预订,它将启动一个会话与汽车租赁代理服务,并要求一个汽车预订。 它创建的这三种新的对话都在与该请求被接收到的初始会话相同的基团(该应用程序使用了WITH RELATED_CONVERSATION
的子句BEGIN DIALOG对他们的所有3)。 然后,它承诺并继续处理队列中的消息。 从这3个相关的请求以后的响应开始在正在添加,在几乎任意时间。 说酒店resposnse谁先。 该消息得到由应用程序了回升,并推行下去,以更新从酒店的响应请求的状态。 与此同时,航空公司的反应来。如果另一个线程将被允许把它捡起来,它会尝试更新同一请求的状态,从而导致阻塞,甚至死锁针对正在处理酒店响应线程。 当处理酒店响应,线程提交和因而解锁整个会话组,从而允许任何线程(包括其本身)拿起航空公司响应并处理它。