

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 読み取りと書き込みには明示的なトランザクションモードを使用してください。
<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>

ミューテーションクエリでは、書き込みトランザクションを作成するための 3 つの異なるメカニズムがあり、それぞれを以下に示します。

**暗黙的な書き込みトランザクションの例:**

```
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) を参照してください。

ミューテーションクエリは、失敗しても自動的に再試行されません。