訊息保留期

適用於:SQL ServerAzure SQL 受控執行個體

當佇列指定訊息保留時,Service Broker 並不會從佇列刪除訊息,直到交談結束為止。 此外,Service Broker 也會將外寄訊息複製到佇列。 這允許服務維持內送和外寄訊息的精確記錄。

訊息保留允許您在交談為使用中時,維護佇列交談的精確記錄。 對於需要詳細稽核的應用程式,或是在交談失敗時必須執行補償交易的應用程式,當交談正在進行中時,這可能會比將每個訊息複製到狀態資料表更加方便。

訊息保留會增加作用中交談佇列內的訊息數目,並增加 SQL Server 在傳送訊息時執行的工作量。 因此,訊息保留會降低效能。 精確的效能影響須視使用佇列之服務的通訊模式而定。 一般而言,您應該在應用程式需要訊息保留才能正確操作時,使用訊息保留。 如果應用程式在交談為使用中時,不需要所有傳送和接收之訊息的精確記錄,則在狀態資料表中維護狀態可改善效能。 另外請記得當交談結束時,會從佇列移除保留的訊息,因此如果您使用保留來進行稽核,請務必確定在結束交談之前,將訊息複製到永久儲存體。

注意

使用訊息保留可能會降低效能。 只有在應用程式服務等級協定要求應用程式須保留已傳送和接收的確切訊息時,才應使用此設定。佇列中已可供接收的訊息會具有狀態 1。 RECEIVE 陳述式會傳回 status 顯示為 1 的訊息。 在 RECEIVE 陳述式傳回訊息後,會將狀態設為 0。而且如果訊息保留開啟時,就會將訊息保留在佇列中。 如果訊息保留關閉,RECEIVE 陳述式則會將訊息從佇列中刪除。 任何使用佇列的服務都會儲存內送和外寄訊息。 在此情況下,SEND 命令會將訊息複製到服務的佇列 ([狀態] 為 3),並將訊息新增至傳輸佇列。 交談結束後,佇列會刪除交談的所有訊息。

應用程式無法接收相同的訊息兩次,而且應用程式無法接收以外寄訊息加入佇列的訊息。 若要使用保留的訊息,請使用 SELECT 陳述式來查詢佇列。 對於稽核,應用程式會在結束交談之前,將保留的訊息插入稽核資料表。 對於補償交易,應用程式通常會透過已處理的訊息來回溯執行,並依序恢復每個訊息的工作,直到處理完所有的訊息。

如需使用 SELECT 陳述式存取佇列的詳細資訊,請參閱查詢佇列

另請參閱