Panoramica dell'elaborazione delle transazioni del bus di servizioOverview of Service Bus transaction processing

Questo articolo descrive le funzionalità delle transazioni del bus di servizio.This article discusses the transaction capabilities of Azure Service Bus. Gran parte della discussione si basa sull'esempio delle transazioni atomiche con il bus di servizio.Much of the discussion is illustrated by the Atomic Transactions with Service Bus sample. Questo articolo si limita a una panoramica dell'elaborazione delle transazioni e della funzionalità invia tramite nel bus di servizio, invece l'esempio delle transazioni atomiche ha un ambito di riferimento più ampio e complesso.This article is limited to an overview of transaction processing and the send via feature in Service Bus, while the Atomic Transactions sample is broader and more complex in scope.

Transazioni nel bus di servizioTransactions in Service Bus

Una transazione raggruppa due o più operazioni in un ambito di esecuzione.A transaction groups two or more operations together into an execution scope. Per natura, questo tipo di transazione deve garantire che tutte le operazioni appartenenti a un determinato gruppo di operazioni abbiano esito positivo o negativo.By nature, such a transaction must ensure that all operations belonging to a given group of operations either succeed or fail jointly. In questo contesto, le transazioni agiscono come unità, spesso definita atomicità.In this respect transactions act as one unit, which is often referred to as atomicity.

Il bus di servizio è un gestore di messaggi transazionali e assicura l'integrità transazionale per tutte le operazioni interne eseguite in relazione agli archivi del messaggio.Service Bus is a transactional message broker and ensures transactional integrity for all internal operations against its message stores. Tutti i trasferimenti di messaggi all'interno del bus di servizio, ad esempio lo spostamento di messaggi a una coda dei messaggi non recapitabili o all'inoltro automatico dei messaggi tra entità, sono transazionali.All transfers of messages inside of Service Bus, such as moving messages to a dead-letter queue or automatic forwarding of messages between entities, are transactional. Di conseguenza, se il bus di servizio accetta un messaggio, questo è già stato archiviato e contrassegnato con un numero di sequenza.As such, if Service Bus accepts a message, it has already been stored and labeled with a sequence number. Da questo momento, i trasferimenti di messaggi all'interno del bus di servizio sono operazioni coordinate tra le entità e non causeranno una perdita (l'origine ha esito positivo, mentre la destinazione ha esito negativo) o una duplicazione (l'origine ha esito negativo, mentre la destinazione ha esito positivo) del messaggio.From then on, any message transfers within Service Bus are coordinated operations across entities, and will neither lead to loss (source succeeds and target fails) or to duplication (source fails and target succeeds) of the message.

Il bus di servizio supporta le operazioni di raggruppamento in una singola entità di messaggistica (coda, argomento, sottoscrizione) nell'ambito di una transazione.Service Bus supports grouping operations against a single messaging entity (queue, topic, subscription) within the scope of a transaction. Ad esempio, è possibile inviare più messaggi a una coda da un ambito di transazione e verrà eseguito il commit dei messaggi al log della coda solo quando la transazione viene completata correttamente.For example, you can send several messages to one queue from within a transaction scope, and the messages will only be committed to the queue's log when the transaction successfully completes.

Operazioni nell'ambito di una transazioneOperations within a transaction scope

È possibile eseguire le operazioni nell'ambito di una transazione come indicato di seguito:The operations that can be performed within a transaction scope are as follows:

Le operazioni di ricezione non vengono incluse perché si presuppone che l'applicazione acquisisca i messaggi usando la modalità ReceiveMode.PeekLock, all'interno di alcuni cicli di ricezione o di un callback OnMessage, e solo successivamente apra un ambito di transazione per l'elaborazione del messaggio.Receive operations are not included, because it is assumed that the application acquires messages using the ReceiveMode.PeekLock mode, inside some receive loop or with an OnMessage callback, and only then opens a transaction scope for processing the message.

La ricezione del messaggio (completamento, abbandono, non recapitabilità, rinvio) si verifica all'interno dell'ambito e dipende dal risultato complessivo della transazione.The disposition of the message (complete, abandon, dead-letter, defer) then occurs within the scope of, and dependent on, the overall outcome of the transaction.

Trasferimenti e "invia tramite"Transfers and "send via"

Per abilitare il passaggio transazionale dei dati da una coda a un processore e successivamente a un'altra coda, il bus di servizio supporta i trasferimenti.To enable transactional handover of data from a queue to a processor, and then to another queue, Service Bus supports transfers. In un'operazione di trasferimento un mittente invia un messaggio a una coda di trasferimento e quest'ultima sposta immediatamente il messaggio alla coda di destinazione prestabilita usando la stessa implementazione di trasferimento affidabile su cui si basa la funzionalità di inoltro automatico.In a transfer operation, a sender first sends a message to a transfer queue, and the transfer queue immediately moves the message to the intended destination queue using the same robust transfer implementation that the auto-forward capability relies on. Non viene mai eseguito il commit del messaggio al log della coda di trasferimento in modo che diventi visibile agli utenti della coda di trasferimento.The message is never committed to the transfer queue's log in a way that it becomes visible for the transfer queue's consumers.

L'efficacia di questa funzionalità transazionale diventa evidente quando la coda di trasferimento stessa è l'origine dei messaggi di input del mittente.The power of this transactional capability becomes apparent when the transfer queue itself is the source of the sender's input messages. In altri termini, il bus di servizio può trasferire il messaggio alla coda di destinazione "tramite" la coda di trasferimento, durante l'esecuzione di un'operazione di completamento (o rinvio o non recapitabilità) nel messaggio di input, il tutto in una singola operazione atomica.In other words, Service Bus can transfer the message to the destination queue "via" the transfer queue, while performing a complete (or defer, or dead-letter) operation on the input message, all in one atomic operation.

Codice di esempioSee it in code

Per impostare tali trasferimenti, si crea un mittente del messaggio che fa riferimento alla coda di destinazione tramite la coda di trasferimento.To set up such transfers, you create a message sender that targets the destination queue via the transfer queue. È inoltre disponibile un destinatario che estrae i messaggi dalla stessa coda.You also have a receiver that pulls messages from that same queue. ad esempio:For example:

var sender = this.messagingFactory.CreateMessageSender(destinationQueue, myQueueName);
var receiver = this.messagingFactory.CreateMessageReceiver(myQueueName);

Una transazione semplice usa questi elementi, come nell'esempio seguente:A simple transaction then uses these elements, as in the following example:

var msg = receiver.Receive();

using (scope = new TransactionScope())
{
    // Do whatever work is required 

    var newmsg = ... // package the result 

    msg.Complete(); // mark the message as done
    sender.Send(newmsg); // forward the result

    scope.Complete(); // declare the transaction done
} 

Passaggi successiviNext steps

Per altre informazioni sulle code del bus di servizio, vedere gli articoli seguenti:See the following articles for more information about Service Bus queues: