Symptomen

Overweeg het volgende scenario:

  • U gebruikt Service Broker in 2017 van SQL Server op Windows, Microsoft SQL Server 2014 of Microsoft SQL Server 2012.

  • U instellen Service Broker voor asynchrone opgeslagen procedure uitvoeren.

  • U instellen de eigenschap Max_Queue_Readers op een specifieke waarde voor de Service Broker-wachtrij te beperken hoeveel exemplaren van de activering van een opgeslagen procedure uitgevoerd op hetzelfde moment

In dit geval ziet u dat meer taken geactiveerd worden uitgevoerd dan de waarde die ingesteld voor de Max_Queue_Readers.

Oorzaak

Dit probleem kan optreden als de Service Broker-database wordt ingeschakeld in de modus voor één gebruiker (brengen) modus voor meerdere gebruikers (MULTI_USER) door het uitvoeren van de volgende:

alter database <dbname> set multi_userWanneer de gebruiker op de database is gewijzigd, wordt de Service Broker afgesloten en opnieuw gestart. Tijdens dit proces wordt het bestaande QueueMonitor-object wordt verwijderd en een ander exemplaar van het QueueMonitor-object is gemaakt. Als u het activeringsproces is een lange bewerking wordt uitgevoerd terwijl de Broker-Service wordt afgesloten, wordt de status van het QueueMonitor-object gewijzigd in verloren.

Het bestaande exemplaar van het object QueueMonitor is niet verwijderd omdat de referentietelling heeft nul niet bereikt. Als u de activeringsprocedure is nog actief als Broker-Service opnieuw wordt gestart, wordt het nieuwe exemplaar van het object QueueMonitor en de decoratieve QueueMonitor-object in dezelfde wachtrij naast elkaar bestaan. De decoratieve QueueMonitor exemplaar van het object worden de volgende keer dat de Service Broker wordt gestart verwijderd.

Tijdelijke oplossing

U kunt dit probleem omzeilen, moet u uitvoeren database [dbname] set multi_user veranderen wanneer er geen geactiveerde procedure wordt uitgevoerd. Gebruik hiervoor een van de volgende methoden:

  • De wachtrijen in de database uitschakelen voordat u de gebruikersmodus, en alle wachtrijen weer inschakelen.

  • De activeringsprocedure voor de desbetreffende wachtrijen uitschakelen door de volgende opdracht uit te voeren voordat u de gebruikersmodus, en de activeringsprocedure opnieuw inschakelen:

    alter queue <queueName> with activation ( status = off)

Meer informatie

U kunt het nummer van de activering van procedures die worden uitgevoerd voor een specifieke wachtrij door het uitvoeren van een query op 'sys.dm_broker_activated_tasks' als volgt controleren:

select * from sys.dm_broker_activated_tasks where queue_id = <queue number>U kunt de status van de monitor van de wachtrij zoeken door het uitvoeren van de volgende query:

Select * from sys.dm_broker_queue_monitors where queue_id = <queue number>De status van de monitor van de wachtrij wordt weergegeven als "verloren" Als de gebruikersmodus van de database is gewijzigd.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Hoe tevreden bent u met de taalkwaliteit?
Wat heeft uw ervaring beïnvloed?

Bedankt voor uw feedback.

×