Condividi tramite


Blocchi del gruppo di conversazioni

In Service Broker i blocchi del gruppo di conversazioni garantiscono che solo un agente di lettura coda possa operare su un set correlato di messaggi in un momento specifico e che i messaggi vengano elaborati una sola volta rispettando l'ordine di invio.

Tutte le conversazioni appartengono a un gruppo di conversazioni. Per impostazione predefinita, ogni conversazione appartiene a un gruppo di conversazioni diverso e pertanto dispone di un identificatore del gruppo di conversazioni differente. L'istruzione MOVE CONVERSATION consente di modificare il gruppo di conversazioni per una conversazione, mentre l'istruzione BEGIN DIALOG CONVERSATION contiene opzioni per associare una nuova conversazione a un gruppo di conversazioni esistente. Per ulteriori informazioni sui gruppi di conversazioni, vedere Gruppi di conversazioni.

Un blocco del gruppo di conversazioni costituisce un blocco esclusivo su un set di messaggi che condividono lo stesso identificatore del gruppo di conversazioni. I blocchi del gruppo di conversazioni sono progettati per ragioni di semplicità, efficienza e correttezza. Non è disponibile alcun comando esplicito o hint per l'acquisizione o l'eliminazione di un blocco del gruppo di conversazioni. Al contrario, ogni comando di Service Broker che influisce su un dialogo o su un gruppo di conversazioni acquisisce automaticamente il blocco del gruppo di conversazioni appropriato. Un'istruzione BEGIN DIALOG ad esempio blocca il gruppo di conversazioni cui il nuovo dialogo appartiene, mentre un'istruzione RECEIVE blocca il gruppo di conversazioni cui appartengono i messaggi ricevuti.

In una sessione un blocco del gruppo di conversazioni viene mantenuto per la durata della transazione all'interno della quale la sessione ha acquisito il blocco. Una sessione non può tuttavia mantenere un blocco del gruppo di conversazioni durante transazioni diverse. Quando una transazione termina, tutti i blocchi del gruppo di conversazioni acquisiti durante la transazione vengono rilasciati.

Poiché il blocco viene eseguito per il gruppo di conversazioni anziché per l'ID di conversazione, viene applicato solo a un lato della conversazione, anche quando sia il servizio Initiator che il servizio di destinazione si trovano nello stesso database. Un blocco acquisito dal servizio di destinazione non blocca il servizio di origine e viceversa. Il Motore di database non applica inoltre il blocco nel caso di aggiunta di messaggi in arrivo a una coda, ma aggiunge messaggi alla coda anche quando in un'applicazione è presente un blocco sul gruppo di conversazioni cui i messaggi appartengono.

In termini pratici questo significa che un'applicazione che utilizza solo identificatori recuperati da Service Broker non deve attendere di acquisire blocchi sulle risorse di Service Broker. La maggior parte delle applicazioni di Service Broker sono progettate per sfruttare i vantaggi dei blocchi disponibili in Service Broker, ovvero utilizzano solo identificatori del gruppo di conversazioni e handle di conversazione ottenuti da un'istruzione di Service Broker all'interno della stessa transazione.

Si supponga ad esempio che un'applicazione ottenga in genere un identificatore del gruppo di conversazioni da Service Broker, recuperi lo stato da una tabella apposita, quindi elabori i messaggi per le conversazioni del gruppo di conversazioni specifico. Dopo che l'applicazione ha ottenuto l'identificatore del gruppo di conversazioni, dispone di un blocco sul gruppo di conversazioni e nessun'altra istanza dell'applicazione può acquisire il blocco. Il blocco del gruppo di conversazioni non impedisce tuttavia alle altre istanze dell'applicazione di ricevere messaggi relativi ad altri gruppi di conversazioni né impedisce l'arrivo di messaggi nella coda.

Grazie a questa strategia di blocco, Service Broker può garantire che i messaggi vengano elaborati nell'ordine corretto. Poiché solo un agente di lettura coda può elaborare messaggi per un gruppo di conversazioni specifico, non esiste alcun rischio che due agenti di lettura coda ricevano messaggi nello stesso gruppo di conversazioni contemporaneamente. Per una conversazione specifica, l'istruzione RECEIVE restituisce i messaggi nell'ordine in cui sono stati inviati. In questo modo più agenti di lettura coda possono elaborare messaggi della coda senza che sia necessario coordinare l'ordinamento in modo esplicito.

Poiché il blocco opera su un gruppo di conversazioni anziché su una singola conversazione, un agente di lettura coda che non indica una conversazione specifica nell'istruzione RECEIVE può ricevere messaggi da conversazioni diverse che appartengono allo stesso gruppo di conversazioni. L'istruzione RECEIVE restituisce inoltre il successivo messaggio disponibile nella coda, indipendentemente dall'appartenenza del messaggio a un gruppo di conversazioni attualmente sbloccato o bloccato nella transazione corrente. Per ricevere messaggi da una conversazione specifica, indicare l'handle di conversazione nell'istruzione RECEIVE, mentre per riceverli da un gruppo di conversazioni specifico, indicarne il relativo identificatore nell'istruzione RECEIVE.

Come risultato di questa strategia di blocco, l'applicazione deve acquisire un blocco del gruppo di conversazioni prima di aggiornare la tabella di stato relativa all'applicazione stessa. Nella maggior parte dei casi questa situazione si verifica automaticamente quando l'applicazione riceve un messaggio oppure ottiene un gruppo di conversazioni. Nella gestione degli errori è possibile tuttavia che un'applicazione debba riacquisire il blocco del gruppo di conversazioni prima di aggiornare la tabella di stato per indicare l'errore. Per ulteriori informazioni sulla gestione degli errori, vedere Gestione di errori in Service Broker.

I blocchi del gruppo di conversazioni vengono acquisiti nelle istruzioni seguenti: