

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Neptune에서의 Gremlin 트랜잭션
<a name="access-graph-gremlin-transactions"></a>

Gremlin [트랜잭션](transactions.md)이 실행되는 컨텍스트는 여러 가지가 있습니다. Gremlin을 사용할 때는 작업 중인 컨텍스트와 그 의미를 이해하는 것이 중요합니다.
+ **`Script-based`**   –   요청은 다음과 같은 텍스트 기반 Gremlin 문자열을 사용하여 이루어집니다.
  + Java 드라이버 및 `Client.submit(string)` 사용.
  + Gremlin 콘솔 및 `:remote connect` 사용.
  + HTTP API 사용.
+ **`Bytecode-based`**   –   요청은 [Gremlin Language Variants](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>

 세션이 없는 경우 요청은 단일 트랜잭션과 동일합니다.

스크립트의 경우 단일 요청으로 전송된 하나 이상의 Gremlin 문이 단일 트랜잭션으로 커밋되거나 롤백된다는 의미입니다. 예제:

```
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>

세션에 바인딩된 경우 단일 트랜잭션의 컨텍스트 내에서 여러 요청을 적용할 수 있습니다.

스크립트의 경우 모든 그래프 작업을 하나의 포함된 문자열 값으로 연결할 필요가 없다는 의미입니다.

```
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 Language Variants(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로 작성되었지만, Python, Javascript, .NET에서도 이 `tx()` 구문을 사용할 수 있습니다.

**주의**  
세션 없는 읽기 전용 쿼리는 [SNAPSHOT](transactions-isolation-levels.md) 격리 상태에서 실행되지만, 명시적 트랜잭션 내에서 실행되는 읽기 전용 쿼리는 [SERIALIZABLE](transactions-isolation-levels.md) 격리 상태에서 실행됩니다. `SERIALIZABLE` 격리 상태에서 실행되는 읽기 전용 쿼리는 `SNAPSHOT` 격리 상태에서 실행되는 쿼리와 달리 높은 오버헤드를 유발하고 동시 쓰기를 차단하거나 이로 인해 차단될 수 있습니다.