Konversationsgrupplås

gäller för:SQL ServerAzure SQL Managed Instance

Service Broker använder konversationsgrupplås för att garantera att endast en köläsare kan arbeta med en relaterad uppsättning meddelanden vid en viss tidpunkt. Service Broker använder konversationsgrupplås för att garantera att meddelanden bearbetas exakt en gång i ordning.

Alla konversationer tillhör en konversationsgrupp. Som standard tillhör varje konversation en annan konversationsgrupp, så den har en annan identifierare för konversationsgrupper. Instruktionen MOVE CONVERSATION ändrar konversationsgruppen för en konversation. Instruktionen BEGIN DIALOG CONVERSATION innehåller alternativ för att associera en ny konversation med en befintlig konversationsgrupp. Mer information om konversationsgrupper finns i Konversationsgrupper.

Ett konversationsgrupplås är i själva verket ett exklusivt lås på en uppsättning meddelanden som delar samma konversationsgruppsidentifierare. Lås för konversationsgrupper är utformade för enkelhet, effektivitet och korrekthet. Det finns inget explicit kommando eller tips för att hämta eller släppa ett konversationsgrupplås. I stället hämtar varje Service Broker-kommando som påverkar en dialogruta eller konversationsgrupp lämpligt lås för konversationsgruppen automatiskt. En instruktion låser till exempel BEGIN DIALOG den konversationsgrupp som den nya dialogrutan tillhör, medan en RECEIVE instruktion låser konversationsgruppen som de mottagna meddelandena tillhör.

En session innehåller ett konversationsgrupplås under hela transaktionen där sessionen förvärvade låset. En session kan inte innehålla ett konversationsgrupplås mellan transaktioner. När en transaktion avslutas släpps alla konversationsgrupplås som förvärvats under transaktionen.

Låsning sker för konversationsgruppen i stället för för konversations-ID:t. Låset gäller därför bara för ena sidan av konversationen, även när både initieraren och målet finns i samma databas. Ett lås som hämtas av måltjänsten blockerar inte den initierande tjänsten och vice versa. Dessutom framtvingar inte databasmotorn låsning när inkommande meddelanden läggs till i en kö. Databasmotorn lägger till meddelanden i kön även när ett program har ett konversationsgrupplås på den konversationsgrupp som meddelandena tillhör.

I praktiken innebär det att ett program som endast använder identifierare som hämtats från Service Broker inte behöver vänta med att hämta lås på Service Broker-resurser. De flesta Service Broker-program är utformade för att dra nytta av låsningen som tillhandahålls av Service Broker; De flesta Service Broker-program använder alltså bara konversationsgruppidentifierare och konversationshandtag som har hämtats från en Service Broker-instruktion inom samma transaktion.

Ett program hämtar till exempel vanligtvis en konversationsgruppidentifierare från Service Broker, hämtar tillstånd från en tillståndstabell och bearbetar sedan meddelanden för konversationer i den konversationsgruppen. När programmet hämtar konversationsgruppidentifieraren har programmet ett lås på konversationsgruppen: ingen annan instans av programmet kan hämta låset. Men konversationsgrupplåset hindrar inte andra instanser av programmet från att ta emot meddelanden för andra konversationsgrupper och hindrar inte inkommande meddelanden från att komma till kön.

Med den här låsningsstrategin kan Service Broker garantera bearbetning av meddelanden i ordning. Eftersom endast en köläsare kan bearbeta meddelanden för en viss konversationsgrupp finns det ingen risk för att två köläsare får meddelanden i samma konversationsgrupp samtidigt. För en specifik konversation returnerar -instruktionen RECEIVE meddelanden i den ordning som meddelandena skickades, så att flera köläsare kan bearbeta meddelanden från kön utan att uttryckligen samordna beställningen.

Eftersom låsning fungerar på en konversationsgrupp i stället för en enskild konversation kan en köläsare som inte anger en viss konversation i -instruktionen RECEIVE ta emot meddelanden från olika konversationer som tillhör samma konversationsgrupp. Dessutom returnerar instruktionen RECEIVE nästa tillgängliga meddelande i kön, oavsett om meddelandet ingår i en konversationsgrupp som för närvarande är olåst eller är låst i den aktuella transaktionen. Om du vill ta emot meddelanden från en viss konversation anger du konversationshandtaget i -instruktionen RECEIVE . Om du vill ta emot meddelanden från en viss konversationsgrupp anger du konversationsgruppidentifieraren i -instruktionen RECEIVE .

Som ett resultat av den här låsningsstrategin bör programmet skaffa ett konversationsgrupplås innan tillståndstabellen för programmet uppdateras. För det mesta sker detta automatiskt när programmet tar emot ett meddelande eller hämtar en konversationsgrupp. När du hanterar fel kan dock ett program behöva återkräva konversationsgruppslåset innan tillståndstabellen uppdateras för att indikera felet. Mer information om felhantering finns i Felhantering för Service Broker.

Följande instruktioner hämtar konversationsgrupplås: