

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用明確的交易模式進行讀取和寫入
<a name="best-practices-opencypher-use-explicit-txs"></a>

使用交易搭配 Neptune 和 Bolt 驅動程式時，最好將讀取和寫入交易的存取模式明確設定為正確的設定。

## 唯讀交易
<a name="best-practices-opencypher-read-txs"></a>

對於唯讀交易，如果您在建置工作階段時未傳入適當的存取模式組態，則會使用預設隔離層級，也就是變動查詢隔離。因此，對於唯讀交易來說，將存取模式明確設定為 `read` 很重要。

**自動遞交讀取交易範例：**

```
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()
}
```

**讀取交易範例：**

```
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)
    }
  }
);
```

在這兩種情況下，[`SNAPSHOT` 隔離](transactions-isolation-levels.md)都是使用 [Neptune 唯讀交易語義](transactions-neptune.md#transactions-neptune-read-only)來達成的。

因為僅供讀取複本只接受唯讀查詢，所以提交至僅供讀取複本的任何查詢都會在 `SNAPSHOT` 隔離語義下執行。

唯讀交易沒有已變更讀取或不可重複讀取。

## 變動交易
<a name="best-practices-opencypher-mutation-txs"></a>

對於變動查詢，有三種不同的機制來建立寫入交易，每個方法描述如下：

**隱含寫入交易範例：**

```
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)
    }
  }
);
```

**自動遞交寫入交易範例：**

```
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()
}
```

**明確寫入交易範例：**

```
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();
```

**寫入交易的隔離層級**
+ 作為變動查詢一部分進行的讀取會在 `READ COMMITTED` 交易隔離下執行。
+ 作為變動查詢一部分進行的讀取沒有任何已讀取讀取。
+ 在變動查詢中讀取時，會鎖定記錄和記錄範圍。
+ 當變動交易讀取某個索引範圍時，強力保證在讀取結束之前，任何並行交易都不會修改此範圍。

變動查詢不是執行緒安全的。

如需衝突，請參閱 [使用鎖定等待逾時的衝突解決機制](transactions-neptune.md#transactions-neptune-conflicts)。

變動查詢不會在失敗的情況下自動重試。