

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

# Neptune での Gremlin トランザクション
<a name="access-graph-gremlin-transactions"></a>

Gremlin [トランザクション](transactions.md)が実行されるコンテキストはいくつかあります。Gremlin を使用する際には、作業対象となるコンテキストとその意味を理解することが重要です。
+ **`Script-based`** — リクエストは、次のようなテキストベースの Gremlin 文字列を使用して行われます。
  + Java ドライバーと `Client.submit(string)` の使用。
  + Gremlin コンソールと `:remote connect` の使用。
  + バルク API の使用。
+ **`Bytecode-based`** — リクエストは、[Gremlin 言語バリアント](https://tinkerpop.apache.org/docs/current/reference/#gremlin-drivers-variants) (GLV) のシリアル化された Gremlin バイトコードを使用して行われます。

  例えば、Java ドライバー `g = traversal().withRemote(...)` を使用する場合などです。

上記のコンテキストのどちらでも、リクエストがセッションレスまたはセッションにバインドされた状態で送信されるという追加のコンテキストがあります。

**注記**  
 Gremlin トランザクションは、サーバー側のリソースを解放できるように、常にコミットまたはロールバックする必要があります。トランザクション中にエラーが発生した場合は、失敗した特定のリクエストだけでなく、トランザクション全体を再試行することが重要です。

## セッションレスリクエスト
<a name="access-graph-gremlin-transactions-sessionless"></a>

 セッションレスの場合、リクエストは 1 回のトランザクションに相当します。

スクリプトの場合、1 回のリクエストで送信された 1 つ以上の Gremlin ステートメントが 1 つのトランザクションとしてコミットまたはロールバックされることを意味します。例えば、次のようになります。

```
Cluster cluster = Cluster.open();
Client client = cluster.connect(); // sessionless
// 3 vertex additions in one request/transaction:
client.submit("g.addV();g.addV();g.addV()").all().get();
```

バイトコードの場合、`g` からトラバーサルが生成され実行されるたびに、セッションレスリクエストが行われます。

```
GraphTraversalSource g = traversal().withRemote(...);

// 3 vertex additions in three individual requests/transactions:
g.addV().iterate();
g.addV().iterate();
g.addV().iterate();

// 3 vertex additions in one single request/transaction:
g.addV().addV().addV().iterate();
```

## セッションにバインドされたリクエスト
<a name="access-graph-gremlin-transactions-session-bound"></a>

セッションにバインドすると、1 つのトランザクションのコンテキスト内で複数のリクエストを適用できます。

スクリプトの場合、すべてのグラフ操作を連結して 1 つの埋め込み文字列値にする必要がないということです。

```
Cluster cluster = Cluster.open();
Client client = cluster.connect(sessionName); // session
try {
    // 3 vertex additions in one request/transaction:
    client.submit("g.addV();g.addV();g.addV()").all().get();
} finally {
    client.close();
}

try {
    // 3 vertex additions in three requests, but one transaction:
    client.submit("g.addV()").all().get(); // starts a new transaction with the same sessionName
    client.submit("g.addV()").all().get();
    client.submit("g.addV()").all().get();
} finally {
    client.close();
}
```

バイトコードの場合、TinkerPop `3.5.x` 以降、トランザクションを明示的に制御し、セッションを透過的に管理できます。Gremlin 言語バリアント (GLV) は、以下のように Gremlin の `tx()` 構文をサポートして、トランザクションを `commit()` または `rollback()` します。

```
GraphTraversalSource g = traversal().withRemote(conn);

Transaction tx = g.tx();

// Spawn a GraphTraversalSource from the Transaction.
// Traversals spawned from gtx are executed within a single transaction.
GraphTraversalSource gtx = tx.begin();
try {
    gtx.addV('person').iterate();
    gtx.addV('software').iterate();

    tx.commit();
} finally {
    if (tx.isOpen()) {
        tx.rollback();
    }
}
```

上記の例は Java で記述されていますが、この `tx()` 構文は、Python、Javascript、.NET でも使用できます。

**警告**  
セッションレス読み取り専用クエリは [SNAPSHOT](transactions-isolation-levels.md) 分離下で実行されますが、明示的なトランザクション内で実行される読み取り専用クエリは [SERIALIZABLE](transactions-isolation-levels.md) 分離下で実行されます。`SERIALIZABLE` 分離下で実行される読み取り専用クエリは、`SNAPSHOT` 分離下で実行されるクエリとは異なり、オーバーヘッドが大きくなり、同時書き込みによってブロックしたり、ブロックされたりする可能性があります。