Příznaky

Jde o takovouto situaci:

  • Používáte Service Broker v SQL Server 2017 ve Windows, 2014 Microsoft SQL Server nebo Microsoft SQL Server 2012.

  • Pro spuštění uložené procedury asynchronní nastavit Service Broker.

  • Nastavte vlastnost Max_Queue_Readers na určitou hodnotu pro Service Broker fronty omezit, kolik instancí aktivace uložená procedura, které jsou spuštěny současně

V tomto scénáři zjistíte, že více aktivován úkoly se systémem, než je hodnota, která je nastavena pro Max_Queue_Readers.

Příčina

K tomuto problému může dojít, pokud databáze Service Broker je přepnutí z režimu jednoho uživatele (RESTRICTED_USER) s více uživateli (MULTI_USER) spuštěním následujícího:

alter database <dbname> set multi_userPři změně režimu uživatele v databázi Service Broker je vypnutí a restartování. Během tohoto procesu existující objekt QueueMonitor je zrušen a je vytvořena instance objektu QueueMonitor jiného. Pokud proces aktivace běží dlouhé operace při Service Broker je ukončována, stav QueueMonitor objektu se změní na vyřazených.

Existující instance objektu QueueMonitor však není odstraněn, protože jeho počet odkazů nedosáhl nuly. Postup aktivace spuštěné po restartování služba Broker, novou instanci objektu QueueMonitor a zahozených objektu QueueMonitor bude do stejné fronty koexistovat. Zamítnuté QueueMonitor instance objektu bude odstraněn při příštím spuštění Service Broker.

Jak potíže obejít

Chcete-li tento problém vyřešit, ujistěte se, že spustíte alter databáze [dbname] Sada multi_user, pokud je spuštěna žádná procedura aktivovaná. Chcete-li to provést, použijte jednu z následujících metod:

  • Před změnou režimu uživatele všech front v databázi zakázat a znovu povolit všechny fronty.

  • Před změnou režimu uživatele spuštěním následující příkaz zakázat aktivační procedura pro všechny příslušné fronty a znovu povolit aktivační procedury:

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

Další informace

Můžete zkontrolovat počet aktivační procedury, které používáte pro konkrétní frontu spuštěním dotazu proti "sys.dm_broker_activated_tasks":

select * from sys.dm_broker_activated_tasks where queue_id = <queue number>Spuštěním následujícího dotazu, můžete dotaz Stav sledování fronty:

Select * from sys.dm_broker_queue_monitors where queue_id = <queue number>Stav sledování fronty je zobrazen jako "vynechané", pokud došlo ke změně režimu uživatele databáze.

Potřebujete další pomoc?

Rozšiřte své znalosti a dovednosti
Projít školení
Získejte nové funkce jako první
Připojit se k programu Microsoft Insider

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?

Děkujeme vám za zpětnou vazbu.

×