Transazioni e modalità di blocco delle raccolte Reliable Collections in Azure Service FabricTransactions and lock modes in Azure Service Fabric Reliable Collections

TransazioneTransaction

Una transazione è una sequenza di operazioni eseguite in un'unica unità logica di lavoroA transaction is a sequence of operations performed as a single logical unit of work. e deve includere le proprietà seguenti, dette ACID (atomicità, coerenza, isolamento e durabilità)A transaction must exhibit the following ACID properties. (vedere https://technet.microsoft.com/it-it/library/ms190612):(see: https://technet.microsoft.com/en-us/library/ms190612)

  • Atomicità: una transazione deve essere un'unità di lavoro atomica.Atomicity: A transaction must be an atomic unit of work. In altre parole, devono essere eseguite tutte le modifiche dei dati oppure non ne deve essere eseguita nessuna.In other words, either all its data modifications are performed, or none of them is performed.
  • Coerenza: al termine della transazione, tutti i dati devono essere coerentiConsistency: When completed, a transaction must leave all data in a consistent state. e tutte le strutture di dati interne devono risultare corrette.All internal data structures must be correct at the end of the transaction.
  • Isolamento: le modifiche eseguite da transazioni simultanee devono essere isolate da quelle eseguite da qualsiasi altra transazione simultanea.Isolation: Modifications made by concurrent transactions must be isolated from the modifications made by any other concurrent transactions. Il livello di isolamento usato per un'operazione all'interno di un oggetto ITransaction è determinato dall'interfaccia IReliableState che esegue l'operazione.The isolation level used for an operation within an ITransaction is determined by the IReliableState performing the operation.
  • Durabilità: gli effetti di una transazione completata sono permanenti all'interno del sistema.Durability: After a transaction has completed, its effects are permanently in place in the system. Le modifiche eseguite rimangono valide anche in caso di errore del sistema.The modifications persist even in the event of a system failure.

Livelli di isolamentoIsolation levels

Il livello di isolamento definisce il grado in cui la transazione deve essere isolata dalle modifiche apportate da altre transazioni.Isolation level defines the degree to which the transaction must be isolated from modifications made by other transactions. Le raccolte Reliable Collections supportano due livelli di isolamento:There are two isolation levels that are supported in Reliable Collections:

  • Repeatable Read: specifica che le istruzioni non possono leggere dati modificati da altre transazioni di cui non è ancora stato eseguito il commit e che nessun'altra transazione può modificare i dati letti dalla transazione corrente, finché quest'ultima non viene completata.Repeatable Read: Specifies that statements cannot read data that has been modified but not yet committed by other transactions and that no other transactions can modify data that has been read by the current transaction until the current transaction finishes. Per altre informazioni, vedere https://msdn.microsoft.com/library/ms173763.aspx.For more details, see https://msdn.microsoft.com/library/ms173763.aspx.
  • Snapshot: specifica che i dati letti da qualsiasi istruzione in una transazione rappresentano la versione coerente dal punto di vista transazionale dei dati esistenti al momento dell'avvio della transazione.Snapshot: Specifies that data read by any statement in a transaction is the transactionally consistent version of the data that existed at the start of the transaction. La transazione può quindi riconoscere solo le modifiche dei dati di cui è stato eseguito il commit prima dell'avvio della transazione.The transaction can recognize only data modifications that were committed before the start of the transaction. Le modifiche apportate da altre transazioni dopo l'inizio della transazione corrente non sono visibili per le istruzioni eseguite nella transazione corrente.Data modifications made by other transactions after the start of the current transaction are not visible to statements executing in the current transaction. È come se le istruzioni di una transazione ottenessero uno snapshot dei dati di cui è stato eseguito il commit così come si presentavano al momento dell'avvio della transazione.The effect is as if the statements in a transaction get a snapshot of the committed data as it existed at the start of the transaction. Gli snapshot tra le Reliable Collections sono coerenti.Snapshots are consistent across Reliable Collections. Per altre informazioni, vedere https://msdn.microsoft.com/library/ms173763.aspx.For more details, see https://msdn.microsoft.com/library/ms173763.aspx.

Le raccolte Reliable Collections scelgono automaticamente il livello di isolamento da usare per una determinata operazione di lettura a seconda dell'operazione stessa e del ruolo della replica al momento della creazione della transazione.Reliable Collections automatically choose the isolation level to use for a given read operation depending on the operation and the role of the replica at the time of transaction's creation. La tabella seguente descrive i valori predefiniti del livello di isolamento per le operazioni Reliable Dictionary e Reliable Queue.Following is the table that depicts isolation level defaults for Reliable Dictionary and Queue operations.

Operazione\RuoloOperation \ Role PrimarioPrimary SecondarioSecondary
Lettura di entità singolaSingle Entity Read Repeatable ReadRepeatable Read SnapshotSnapshot
Enumerazione, conteggioEnumeration, Count SnapshotSnapshot SnapshotSnapshot

Nota

Alcuni esempi comuni per le operazioni sulla singola entità sono IReliableDictionary.TryGetValueAsync e IReliableQueue.TryPeekAsync.Common examples for Single Entity Operations are IReliableDictionary.TryGetValueAsync, IReliableQueue.TryPeekAsync.

Gli oggetti ReliableDictionary e ReliableQueue supportano entrambi il criterio "Read Your Writes".Both the Reliable Dictionary and the Reliable Queue support Read Your Writes. In altri termini, qualsiasi operazione di scrittura all'interno di una transazione sarà visibile a una lettura successiva appartenente alla stessa transazione.In other words, any write within a transaction will be visible to a following read that belongs to the same transaction.

BlocchiLocks

Nelle raccolte Reliable Collections tutte le transazioni implementano un rigoroso blocco in due fasi: una transazione non rilascia i blocchi acquisiti fino a quando non termina con un'interruzione o un commit.In Reliable Collections, all transactions implement rigorous two phase locking: a transaction does not release the locks it has acquired until the transaction terminates with either an abort or a commit.

L'operazione Reliable Dictionary usa il blocco a livello di riga per tutte le operazioni sulla singola entità.Reliable Dictionary uses row level locking for all single entity operations. L'operazione Reliable Queue bilancia la concorrenza in cambio di una proprietà FIFO transazionale rigorosa.Reliable Queue trades off concurrency for strict transactional FIFO property. Reliable Queue usa i blocchi a livello di operazione che consentono una transazione con TryPeekAsync e/o TryDequeueAsync e una transazione con EnqueueAsync per volta.Reliable Queue uses operation level locks allowing one transaction with TryPeekAsync and/or TryDequeueAsync and one transaction with EnqueueAsync at a time. Si noti che per mantenere il modello FIFO, se TryPeekAsync o TryDequeueAsync rileva che la coda affidabile è vuota, bloccherà anche EnqueueAsync.Note that to preserve FIFO, if a TryPeekAsync or TryDequeueAsync ever observes that the Reliable Queue is empty, they will also lock EnqueueAsync.

Le operazioni di scrittura acquisiscono sempre blocchi esclusivi.Write operations always take Exclusive locks. Per le operazioni di lettura, il blocco dipende da due fattori.For read operations, the locking depends on a couple of factors. Le operazioni di lettura eseguite con Shapshot Isolation sono prive di blocchi.Any read operation done using Snapshot isolation is lock free. Per impostazione predefinita, ogni operazione di lettura ripetibile acquisisce blocchi condivisi.Any Repeatable Read operation by default takes Shared locks. Tuttavia, per ogni operazione di lettura che supporta Repeatable Read, l'utente può chiedere un blocco di aggiornamento al posto del blocco condiviso.However, for any read operation that supports Repeatable Read, the user can ask for an Update lock instead of the Shared lock. Il blocco di aggiornamento è asimmetrico e viene usato per impedire una forma comune di deadlock che si verifica quando più transazioni bloccano le risorse per un potenziale aggiornamento in un secondo momento.An Update lock is an asymmetric lock used to prevent a common form of deadlock that occurs when multiple transactions lock resources for potential updates at a later time.

La matrice di compatibilità dei blocchi è disponibile nella tabella seguente:The lock compatibility matrix can be found in the following table:

Richiesto\ConcessoRequest \ Granted NessunoNone CondivisoShared AggiornamentoUpdate EsclusivoExclusive
CondivisoShared Nessun conflittoNo conflict Nessun conflittoNo conflict ConflittoConflict ConflittoConflict
AggiornamentoUpdate Nessun conflittoNo conflict Nessun conflittoNo conflict ConflittoConflict ConflittoConflict
EsclusivoExclusive Nessun conflittoNo conflict ConflittoConflict ConflittoConflict ConflittoConflict

Per il rilevamento dei deadlock viene usato un argomento timeout delle API Reliable Collections.Time-out argument in the Reliable Collections APIs is used for deadlock detection. Si supponga, ad esempio, che due transazioni (T1 e T2) stiano cercando di leggere e aggiornare K1.For example, two transactions (T1 and T2) are trying to read and update K1. È possibile che si verifichi un deadlock, poiché entrambe le transazioni si concludono con il blocco condiviso.It is possible for them to deadlock, because they both end up having the Shared lock. In questo caso, potrebbe verificarsi il timeout di una o di entrambe le operazioni.In this case, one or both of the operations will time out.

Questo scenario di deadlock è un perfetto esempio di come il blocco di aggiornamento possa impedire i deadlock.This deadlock scenario is a great example of how an Update lock can prevent deadlocks.

Passaggi successiviNext steps