Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Transação
Uma transação é uma sequência de operações executadas como uma única unidade lógica de trabalho. Além disso, exibe as propriedades comuns ACID (atomicidade, consistência, isolamento, durabilidade) das transações de banco de dados:
- Atomicidade: uma transação deve ser uma unidade atômica de trabalho. Em outras palavras, ou todas as suas modificações de dados são realizadas, ou nenhuma delas é realizada.
- Consistência: quando concluída, uma transação deve deixar todos os dados em um estado consistente. Todas as estruturas de dados internos devem estar corretas ao final da transação.
- Isolamento: as modificações feitas por transações simultâneas devem ser isoladas das modificações feitas por quaisquer outras transações simultâneas. O nível de isolamento usado para uma operação em um ITransaction é determinado pelo IReliableState que executa a operação.
- Durabilidade: após a conclusão de uma transação, seus efeitos estão permanentemente em vigor no sistema. As modificações persistem até mesmo no caso de uma queda do sistema.
Níveis de isolamento
Nível de isolamento define o grau no qual a transação deve ser isolada de modificações feitas por outras transações. Há dois níveis de isolamento com suporte nas Coleções Confiáveis:
Leitura repetida: especifica que as instruções não podem ler dados que foram modificados, mas ainda não foram confirmados por outras transações e que nenhuma outra transação pode modificar dados que foram lidos pela transação atual até que a transação atual seja concluída.
- Benefícios da Leitura de transações repetíveis:
- Menor uso de memória do que transações instantâneas
- Garante o retorno consistente de valores para várias leituras em um determinado momento
- Considerações para Leitura de transações repetíveis:
As gravações são bloqueadas enquanto há uma leitura ativa dos dados
As leituras também são bloqueadas enquanto há uma gravação ativa dos dados.
- Benefícios da Leitura de transações repetíveis:
Instantâneo: especifica que os dados lidos por qualquer instrução em uma transação são a versão transacionalmente consistente dos dados que existiam no início da transação. A transação pode reconhecer apenas as modificações de dados que foram confirmadas antes da primeira leitura da transação. As modificações de dados feitas por outras transações após o início da transação atual não são visíveis para instruções executadas na transação atual.
O efeito é como se as instruções em uma transação obtivessem um instantâneo dos dados confirmados conforme existiam no início da transação. Os instantâneos são consistentes entre as Coleções Confiáveis.
- Benefícios das transações de instantâneo:
- Permite gravações mesmo quando um valor foi lido em uma transação não confirmada
- Considerações sobre transações de instantâneo:
- As transações de instantâneo de execução prolongada podem resultar em um grande espaço de memória para o serviço, pois mais valores são movidos para a memória para manter o isolamento do instantâneo
- Transações diferentes podem retornar valores diferentes para dados de leitura, dependendo de quando o instantâneo foi tirado
- Benefícios das transações de instantâneo:
As Coleções Confiáveis escolhem automaticamente o nível de isolamento a ser usado para uma determinada operação de leitura dependendo da operação e da função da réplica no momento da criação da transação. A seguir está a tabela que descreve os padrões de nível de isolamento para operações de Dicionário Confiável e Fila.
Operação \ Função | Primária | Secundário |
---|---|---|
Leitura de entidade única | Leitura Repetível | Instantâneo |
Enumeração, Contagem | Instantâneo | Instantâneo |
Observação
Exemplos comuns de Operações de Entidade Única são IReliableDictionary.TryGetValueAsync
, IReliableQueue.TryPeekAsync
.
O Dicionário Confiável e a Fila Confiável são compatíveis com Read Your Writes. Em outras palavras, qualquer gravação em uma transação será visível para uma leitura seguinte que pertence à mesma transação.
Exemplo de comportamento de leitura repetível
Exemplo de isolamento de repetição de leitura em coleções confiáveis
Neste exemplo, você pode ver que T2 é impedido de adquirir um bloqueio em K1 até que T1 se comprometa, pois T1 atualmente mantém um bloqueio de leitura na chave.
Exemplo de comportamento do instantâneo
Neste exemplo, você pode ver que, embora t2 tenha atualizado o valor de K1 para V6, T2 ainda enumera K1 como V1 enquanto ainda está ciente de sua própria alteração para K2. O T3 não é afetado, pois lê chaves que não têm nenhum bloqueio de gravação atual.
Locks
Nas Coleções Confiáveis, todas as transações implementam um bloqueio de duas fases rigoroso: uma transação não libera os bloqueios que adquiriu até que a transação seja encerrada com uma confirmação ou anulação.
O Dicionário Confiável usa bloqueio para todas as operações de entidade única em nível de linha.
Fila Confiável compensa simultaneidade para propriedade PEPS transacional estrita.
A Fila Confiável usa bloqueios no nível da operação que permitem uma transação com TryPeekAsync
e/ou TryDequeueAsync
e uma transação com EnqueueAsync
de cada vez.
Observe que, para preservar o FIFO, se um TryPeekAsync
ou TryDequeueAsync
alguma vez observar que a Fila Confiável está vazia, eles também bloquearão EnqueueAsync
.
Operações de gravação sempre utilizam bloqueios exclusivos. Em operações de leitura, o bloqueio depende de alguns fatores:
- Qualquer operação de leitura feita usando o isolamento de Instantâneo não terá bloqueio.
- Qualquer operação de Leitura Repetida por padrão recebe bloqueios compartilhados.
- No entanto, para qualquer operação de leitura que dá suporte à Leitura Repetida, o usuário pode solicitar um bloqueio de atualização, em vez do bloqueio compartilhado. Um Bloqueio de atualização é um bloqueio assimétrico usado para evitar uma forma comum de deadlock que ocorre quando várias transações bloqueiam recursos para atualização potencial em um momento posterior.
A matriz de compatibilidade de bloqueio pode ser encontrada na tabela a seguir:
Solicitação\concedida | Nenhum | Compartilhado | Atualizar | Exclusivo |
---|---|---|---|---|
Compartilhado | Sem conflito | Sem conflito | Conflito | Conflito |
Atualizar | Sem conflito | Sem conflito | Conflito | Conflito |
Exclusivo | Sem conflito | Conflito | Conflito | Conflito |
O argumento de tempo limite nas APIs de Coletas Confiáveis é usado para a detecção de deadlock. Por exemplo, duas transações (T1 e T2) estão tentando ler e atualizar K1. É possível que ocorra um deadlock, porque ambas acabam tendo o bloqueio compartilhado.
Nesse caso, uma ou ambas as operações atingirão o tempo limite. Nesse cenário, um bloqueio de atualização pode impedir esse deadlock.