BizTalk-从数据库读取两次接收端口
我的接收端口是sqlBinding和类型化轮询端口。它调用SP获取记录,并根据筛选条件启动相应的业务流程。BizTalk组由2台服务器组成;因此有2个ReceiveHost实例。如果两个主机实例都在运行—在某个点上,同一请求被读取两次—则会在接收方端造成重复。但是,为什么里夫港不止一次读取同一记录?读取记录的进程会更新记录并对其进行更新,以使其不再被复制 我在提交10个请求时观察到了这种情况;接收端口读取11次并启动11个业务流程BizTalk-从数据库读取两次接收端口,biztalk,polling,Biztalk,Polling,我的接收端口是sqlBinding和类型化轮询端口。它调用SP获取记录,并根据筛选条件启动相应的业务流程。BizTalk组由2台服务器组成;因此有2个ReceiveHost实例。如果两个主机实例都在运行—在某个点上,同一请求被读取两次—则会在接收方端造成重复。但是,为什么里夫港不止一次读取同一记录?读取记录的进程会更新记录并对其进行更新,以使其不再被复制 我在提交10个请求时观察到了这种情况;接收端口读取11次并启动11个业务流程 我在一台主机上尝试了相同的(10个请求)(就像在我的开发中一样)
我在一台主机上尝试了相同的(10个请求)(就像在我的开发中一样),接收只显示10个。有什么线索吗?快速回答是,您有两个选项可以解决此问题:
Select * From Record
Where Status = 'Unread'
Update Record
Set Status = 'Read'
Where Status = 'Unread'
上述过程可能会给出重复的记录,因为在select和update之间,select的另一个调用能够潜入并选择尚未更新的记录
实施解决方案
修正程序
该过程的一个简单修复方法是首先使用唯一id进行更新:
Update Record
Set UpdateId = @@SPID, Status = 'Reading'
Where Status = 'Unread'
Select * From Record
Where UpdateId = @@SPID
And Status = 'Reading'
Update Record
Set Status = 'Read'
Where UpdateId = @@SPID
And Status = 'Reading'
@@SPID应该是唯一的,但如果证明不是唯一的,则可以使用newid()
使用群集主机
创建新主机时,可以在BizTalk server管理控制台中指定该主机为群集主机。有关执行此操作的详细信息,请参阅
基本上,您可以正常创建一个主机,每个服务器上都有主机实例,然后右键单击该主机并选择集群
然后为在该主机下工作的轮询创建SQL接收处理程序,并在接收位置使用该处理程序
BizTalk群集主机可确保作为该主机成员的所有项目一次只能在一个主机实例上运行。这将包括您的SQL接收位置,因此在调用您的过程时,您不会有任何竞争条件的机会。您好,这正是我面临的问题。但我看不出使用唯一id如何解决这个问题。也许我没有把所有的点都连接起来。是什么阻止第二次调用更新和选择相同的记录?谢谢