簡單的回答是,你有兩個選擇來解決這個問題:
- 解決您的存儲過程,也就是在併發情況下正確的行爲。
- 將您的SQL輪詢接收處理程序置於羣集BizTalk主機中。
下面是發生了什麼事的解釋,並根據該我給實現的細節來解決該問題:
說明
這是由於到BizTalk接收方式運行時,地點工作在多個主機實例上(即接收位置中指定的適配器的接收處理程序在具有多個主機實例的主機上運行)。
在這種情況下這兩個主機實例的都將運行它們的接收處理程序。
這通常不是問題 - 大多數接收適配器都可以管理此問題,併爲您提供所期望的行爲。例如,文件適配器在讀取文件時會鎖定文件,從而阻止雙重讀取。
這是一個問題的主要地方正是你所看到的 - 當一個輪詢SQL接收位置正在存儲過程。在這種情況下,除了信任SQL過程以提供正確的結果之外,BizTalk沒有別的選擇。
很難說沒有看到你的程序,但你查詢記錄的方式並不能保證獨特的讀取。
也許你有這樣的:
Select * From Record
Where Status = 'Unread'
Update Record
Set Status = 'Read'
Where Status = 'Unread'
上述過程可以給重複的記錄,因爲選擇和更新之間,選擇的另一個呼叫能夠潛入並選擇尚未記錄更新了。
實施解決方案
修復程序
一個簡單的解決方法的過程是一個唯一的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服務器管理控制檯中指定該主機是羣集。這樣做的細節在這post by Kent Weare。
本質上,您可以像平常一樣創建主機,並在每臺服務器上創建主機實例,然後右鍵單擊主機並選擇羣集。
然後,您爲在該主機下運行的輪詢創建SQL接收處理程序,並在您的接收位置使用此處理程序。
BizTalk集羣主機確保作爲該主機成員的所有項目一次只能在一個主機實例上運行。這將包括您的SQL接收位置,因此您在調用過程時不會有任何競爭條件的機會。
你好,這是我面臨的確切問題。但我不知道如何使用唯一的ID解決問題。也許我沒有連接所有的點。什麼阻止第二個電話更新和選擇相同的記錄? 謝謝。 – 2011-01-28 07:22:23