Gravar transações - .NET SDK
Visão geral
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").
Iniciar uma transação
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.
Verificar o status de uma transação
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(); } } }