Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Gravar transações - .NET SDK

Nesta página

  • Visão geral
  • Iniciar uma transação
  • Verificar o status de uma transação

Além de ler objetos, você pode criar, atualizar e excluir objetos de um domínio. Como essas operações modificam o estado do realm, as chamamos de "gravações", e todas as gravações no Realm devem estar dentro de uma transação .

Uma transação é um conjunto de operações de leitura e escrita que o Realm trata como uma única operação indivisível. Uma transação é uma operação tudo ou nada : ou todas as operações na transação são bem-sucedidas ou nenhuma é efetivada.

Um Realm permite apenas uma transação aberta por vez. O Realm bloqueia outras escritas em outras threads até que a transação aberta seja concluída. Isso garante que não haja condição de corrida ao ler valores do Realm em uma transação.

Quando todas as operações em uma transação são concluídas, o Realm a confirma ou cancela a transação:

  • Quando o Realm confirma uma transação, o Realm grava todas as alterações no disco. Para domínios sincronizados, o SDK classifica a alteração para sincronização com o Atlas App Services.

  • Quando o Realm cancela uma transação de escrita (como quando uma operação na transação causa um erro), todas as alterações são descartadas (ou "revertidas").

O .NET SDK fornece uma API simples que você pode usar para a maioria das gravações. Os métodos Write() e WriteAsync() e envolvem todos os comandos em uma única transação e, em seguida, confirmam a transação.

Os métodos Write() e WriteAsync() são abreviações para usar os métodos Comece a escrever() e Transaction.Commit() e suas contrapartes Async . Na maioria dos casos, qualquer um desses dois métodos de escrita atenderá às suas necessidades. Se você precisar de um controle mais preciso sobre a transação, use BeginWrite() com um destes métodos Transaction :

O seguinte código mostra como usar ambas as abordagens:

// Instantiate a class, as normal.
var dog = new Dog { Id = 42, Name = "Max", Age = 5 };
// Open a thread-safe transaction.
realm.Write(() =>
{
// Add the instance to the realm.
realm.Add(dog);
});
// Open a thread-safe transaction.
using (var transaction = realm.BeginWrite())
{
// At this point, the TransactionState is "Running":
// transaction.State == TransactionState.Running
try
{
// Perform a write op...
realm.Add(myDog);
// Do other work that needs to be included in
// this transaction
if (transaction.State == TransactionState.Running)
{
transaction.Commit();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
// Something went wrong; roll back the transaction
if (transaction.State != TransactionState.RolledBack &&
transaction.State != TransactionState.Committed)
{
transaction.Rollback();
}
}
}

Observação

Tokens de cancelamento

Tal como acontece com a maioria dos métodos assíncronos do C#, os métodos WriteAsync, ComeçarWriteAsync e CommitAsync podem receber um CancellationToken como parâmetro, dando a você a opção de cancelar a operação antes que o processo seja concluído.

O SDK fornece uma propriedade TransactionState com o status atual da transação. Você pode usar TransactionState para garantir que você não confirme ou reverta uma transação duas vezes:

// Open a thread-safe transaction.
using (var transaction = realm.BeginWrite())
{
// At this point, the TransactionState is "Running":
// transaction.State == TransactionState.Running
try
{
// Perform a write op...
realm.Add(myDog);
// Do other work that needs to be included in
// this transaction
if (transaction.State == TransactionState.Running)
{
transaction.Commit();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
// Something went wrong; roll back the transaction
if (transaction.State != TransactionState.RolledBack &&
transaction.State != TransactionState.Committed)
{
transaction.Rollback();
}
}
}

Voltar

Segmentação