

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usar modos de transação explícitos para leitura e gravação
<a name="best-practices-opencypher-use-explicit-txs"></a>

Ao usar transações com o Neptune e o driver do Bolt, é melhor definir explicitamente o modo de acesso para transações de leitura e gravação como as configurações corretas.

## Transações somente leitura
<a name="best-practices-opencypher-read-txs"></a>

Para transações somente leitura, se você não transmitir a configuração apropriada do modo de acesso ao criar a sessão, o nível de isolamento padrão será usado, que é o isolamento da consulta de mutação. Como resultado, para as transações somente leitura, é importante definir o modo de acesso como `read` explicitamente.

**Exemplo de transação de leitura de confirmação automática:**

```
SessionConfig sessionConfig = SessionConfig
  .builder()
  .withFetchSize(1000)
  .withDefaultAccessMode(AccessMode.READ)
  .build();
Session session = driver.session(sessionConfig);
try {
  (Add your application code here)
} catch (final Exception e) {
  throw e;
} finally {
  driver.close()
}
```

**Leia o exemplo de transação:**

```
Driver driver = GraphDatabase.driver(url, auth, config);
SessionConfig sessionConfig = SessionConfig
  .builder()
  .withDefaultAccessMode(AccessMode.READ)
  .build();
driver.session(sessionConfig).readTransaction(
  new TransactionWork<List<String>>() {
    @Override
    public List<String> execute(org.neo4j.driver.Transaction tx) {
      (Add your application code here)
    }
  }
);
```

Nos dois casos, o [isolamento de `SNAPSHOT`](transactions-isolation-levels.md) é obtido usando a [semântica de transação somente leitura do Neptune](transactions-neptune.md#transactions-neptune-read-only).

Como as réplicas de leitura só aceitam consultas somente leitura, qualquer consulta enviada a uma réplica de leitura é executada sob a semântica de isolamento `SNAPSHOT`.

Não há leituras sujas ou não repetíveis para transações somente leitura.

## Transações de mutação
<a name="best-practices-opencypher-mutation-txs"></a>

Para consultas de mutação, há três mecanismos diferentes para criar uma transação de gravação, cada um dos quais é ilustrado abaixo:

**Exemplo de transação de gravação implícita:**

```
Driver driver = GraphDatabase.driver(url, auth, config);
SessionConfig sessionConfig = SessionConfig
  .builder()
  .withDefaultAccessMode(AccessMode.WRITE)
  .build();
driver.session(sessionConfig).writeTransaction(
  new TransactionWork<List<String>>() {
    @Override
    public List<String> execute(org.neo4j.driver.Transaction tx) {
      (Add your application code here)
    }
  }
);
```

**Exemplo de transação de gravação de confirmação automática:**

```
SessionConfig sessionConfig = SessionConfig
  .builder()
  .withFetchSize(1000)
  .withDefaultAccessMode(AccessMode.Write)
  .build();
Session session = driver.session(sessionConfig);
try {
  (Add your application code here)
} catch (final Exception e) {
    throw e;
} finally {
    driver.close()
}
```

**Exemplo de transação de gravação explícita:**

```
Driver driver = GraphDatabase.driver(url, auth, config);
SessionConfig sessionConfig = SessionConfig
  .builder()
  .withFetchSize(1000)
  .withDefaultAccessMode(AccessMode.WRITE)
  .build();
Transaction beginWriteTransaction = driver.session(sessionConfig).beginTransaction();
  (Add your application code here)
beginWriteTransaction.commit();
driver.close();
```

**Níveis de isolamento para transações de gravação**
+ As leituras feitas como parte das consultas de mutação são executadas sob isolamento de transações `READ COMMITTED`.
+ Não há leituras sujas para leituras feitas como parte de consultas de mutação.
+ Registros e intervalos de registros são bloqueados durante a leitura de uma consulta de mutação.
+ Quando um intervalo do índice tiver sido lido por uma transação de mutação, há uma forte garantia de que esse intervalo não será modificado por nenhuma transação simultânea até o final da transação de leitura.

As consultas de mutação não são livres de threads.

Sobre conflitos, consulte [Resolução de conflitos usando tempos limite de espera de bloqueio](transactions-neptune.md#transactions-neptune-conflicts).

Em caso de falha, as consultas de mutação não são repetidas automaticamente.