

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

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

Amazon Neptune의 openCypher 구현은 [Neptune에서 정의한 트랜잭션 시맨틱](transactions-neptune.md)을 사용하지만, Bolt 드라이버에서 제공하는 격리 수준은 아래 섹션에 설명된 것처럼 Bolt 트랜잭션 시맨틱에 몇 가지 특정한 영향을 미칩니다.

## 읽기 전용 Bolt 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-ro"></a>

다음과 같이 여러 트랜잭션 모델 및 격리 수준을 사용하여 읽기 전용 쿼리를 처리할 수 있는 다양한 방법이 있습니다.

### 암시적 읽기 전용 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-ro-implicit"></a>

다음은 읽기 전용 암시적 트랜잭션의 예제입니다.

```
public void executeReadImplicitTransaction()
{
  // end point
  final String END_POINT = "(End Point URL)";

  // read query
  final String READ_QUERY = "MATCH (n) RETURN n limit 10";

  // create the driver
  final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(),
          Config.builder().withEncryption()
                          .withTrustStrategy(TrustStrategy.trustSystemCertificates())
                          .build());

  // create the session config
  SessionConfig sessionConfig = SessionConfig.builder()
                                             .withFetchSize(1000)
                                             .withDefaultAccessMode(AccessMode.READ)
                                             .build();

  // run the query as access mode read
  driver.session(sessionConfig).readTransaction(new TransactionWork<String>()
    {
      final StringBuilder resultCollector = new StringBuilder();

      @Override
      public String execute(final Transaction tx)
      {
        // execute the query
        Result queryResult = tx.run(READ_QUERY);

        // Read the result
        for (Record record : queryResult.list())
        {
          for (String key : record.keys())
          {
            resultCollector.append(key)
                           .append(":")
                           .append(record.get(key).asNode().toString());
          }
        }
        return resultCollector.toString();
      }

    }
  );

  // close the driver.
  driver.close();
}
```

읽기 전용 복제본은 읽기 전용 쿼리만 허용하므로, 읽기 전용 복제본에 대한 모든 쿼리는 세션 구성에 설정된 액세스 모드에 관계없이 읽기 암시적 트랜잭션으로 실행됩니다. Neptune은 읽기 암시적 트랜잭션을 `SNAPSHOT` 격리 시맨틱에 따라 [읽기 전용 쿼리](transactions-neptune.md#transactions-neptune-read-only)로 평가합니다.

오류가 발생할 경우 기본적으로 읽기 암시적 트랜잭션이 재시도됩니다.

### 읽기 전용 트랜잭션 쿼리 자동 커밋
<a name="access-graph-opencypher-transactions-ro-autocommit"></a>

다음은 읽기 전용 자동 커밋 트랜잭션의 예제입니다.

```
public void executeAutoCommitTransaction()
{
  // end point
  final String END_POINT = "(End Point URL)";

  // read query
  final String READ_QUERY = "MATCH (n) RETURN n limit 10";

  // Create the session config.
  final SessionConfig sessionConfig = SessionConfig
    .builder()
    .withFetchSize(1000)
    .withDefaultAccessMode(AccessMode.READ)
    .build();

  // create the driver
  final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(),
    Config.builder()
          .withEncryption()
          .withTrustStrategy(TrustStrategy.trustSystemCertificates())
          .build());

  // result collector
  final StringBuilder resultCollector = new StringBuilder();

  // create a session
  final Session session = driver.session(sessionConfig);

  // run the query
  final Result queryResult = session.run(READ_QUERY);
  for (final Record record : queryResult.list())
  {
    for (String key : record.keys())
    {
      resultCollector.append(key)
                     .append(":")
                     .append(record.get(key).asNode().toString());
    }
  }

  // close the session
  session.close();

  // close the driver
  driver.close();
}
```

세션 구성에서 액세스 모드가 `READ`로 설정된 경우 Neptune은 자동 커밋 트랜잭션 쿼리를 `SNAPSHOT` 격리 시맨틱에 따라 [읽기 전용 쿼리](transactions-neptune.md#transactions-neptune-read-only)로 평가합니다. 참고로 읽기 전용 복제본은 읽기 전용 쿼리만 허용합니다.

세션 구성을 전달하지 않으면 자동 커밋 쿼리가 기본적으로 변형 쿼리 격리를 통해 처리되므로, `READ`로 액세스 모드를 명시적으로 설정하는 세션 구성을 전달하는 것이 중요합니다.

실패하는 경우 읽기 전용 자동 커밋 쿼리는 다시 시도되지 않습니다.

### 명시적 읽기 전용 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-ro-explicit"></a>

다음은 명시적 읽기 전용 트랜잭션의 예제입니다.

```
public void executeReadExplicitTransaction()
{
  // end point
  final String END_POINT = "(End Point URL)";

  // read query
  final String READ_QUERY = "MATCH (n) RETURN n limit 10";

  // Create the session config.
  final SessionConfig sessionConfig = SessionConfig
    .builder()
    .withFetchSize(1000)
    .withDefaultAccessMode(AccessMode.READ)
    .build();

  // create the driver
  final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(),
    Config.builder()
          .withEncryption()
          .withTrustStrategy(TrustStrategy.trustSystemCertificates())
          .build());

  // result collector
  final StringBuilder resultCollector = new StringBuilder();

  // create a session
  final Session session = driver.session(sessionConfig);

  // begin transaction
  final Transaction tx = session.beginTransaction();

  // run the query on transaction
  final List<Record> list = tx.run(READ_QUERY).list();

  // read the result
  for (final Record record : list)
  {
    for (String key : record.keys())
    {
      resultCollector
        .append(key)
        .append(":")
        .append(record.get(key).asNode().toString());
    }
  }

  // commit the transaction and for rollback we can use beginTransaction.rollback();
  tx.commit();

  // close the driver
  driver.close();
}
```

세션 구성에서 액세스 모드가 `READ`로 설정된 경우 Neptune은 명시적 읽기 전용 트랜잭션을 `SNAPSHOT` 격리 시맨틱에 따라 [읽기 전용 쿼리](transactions-neptune.md#transactions-neptune-read-only)로 평가합니다. 참고로 읽기 전용 복제본은 읽기 전용 쿼리만 허용합니다.

세션 구성을 전달하지 않으면 명시적 읽기 전용 트랜잭션이 기본적으로 변형 쿼리 격리를 통해 처리되므로, `READ`로 액세스 모드를 명시적으로 설정하는 세션 구성을 전달하는 것이 중요합니다.

실패할 경우 기본적으로 읽기 전용 명시적 쿼리가 다시 시도됩니다.

## 변형 Bolt 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-wr"></a>

읽기 전용 쿼리와 마찬가지로, 다음과 같이 여러 트랜잭션 모델 및 격리 수준을 사용하여 다양한 방법으로 변형 쿼리를 처리할 수 있습니다.

### 암시적 변형 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-wr-implicit"></a>

다음은 암시적 변형 트랜잭션 예제입니다.

```
public void executeWriteImplicitTransaction()
{
  // end point
  final String END_POINT = "(End Point URL)";

  // create node with label as label and properties.
  final String WRITE_QUERY = "CREATE (n:label {name : 'foo'})";

  // Read the vertex created with label as label.
  final String READ_QUERY = "MATCH (n:label) RETURN n";

  // create the driver
  final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(),
    Config.builder()
          .withEncryption()
          .withTrustStrategy(TrustStrategy.trustSystemCertificates())
          .build());

  // create the session config
  SessionConfig sessionConfig = SessionConfig
    .builder()
    .withFetchSize(1000)
    .withDefaultAccessMode(AccessMode.WRITE)
    .build();

  final StringBuilder resultCollector = new StringBuilder();

  // run the query as access mode write
  driver.session(sessionConfig).writeTransaction(new TransactionWork<String>()
  {
    @Override
    public String execute(final Transaction tx)
    {
      // execute the write query and consume the result.
      tx.run(WRITE_QUERY).consume();

      // read the vertex written in the same transaction
      final List<Record> list = tx.run(READ_QUERY).list();

      // read the result
      for (final Record record : list)
      {
        for (String key : record.keys())
        {
          resultCollector
            .append(key)
            .append(":")
            .append(record.get(key).asNode().toString());
        }
      }
      return resultCollector.toString();
    }
  }); // at the end, the transaction is automatically committed.

  // close the driver.
  driver.close();
}
```

변형 쿼리의 일부로 이루어진 읽기는 [Neptune 변형 트랜잭션](transactions-neptune.md#transactions-neptune-mutation)에 대한 일반적인 보장과 함께 `READ COMMITTED` 격리 상태에서 실행됩니다.

특별히 세션 구성을 전달했는지 여부에 관계없이 트랜잭션은 항상 쓰기 트랜잭션으로 처리됩니다.

충돌에 대해서는 [잠금-대기 제한 시간을 이용한 충돌 해결](transactions-neptune.md#transactions-neptune-conflicts)을 참조하세요.

### 자동 커밋 변형 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-wr-autocommit"></a>

변형 자동 커밋 쿼리는 변형 암시적 트랜잭션과 동일한 동작을 상속합니다.

세션 구성을 전달하지 않으면 트랜잭션은 기본적으로 쓰기 트랜잭션으로 처리됩니다.

실패 시 변형 자동 커밋 쿼리는 자동으로 재시도되지 않습니다.

### 명시적 변형 트랜잭션 쿼리
<a name="access-graph-opencypher-transactions-wr-explicit"></a>

다음은 명시적 변형 트랜잭션의 예제입니다.

```
public void executeWriteExplicitTransaction()
{
  // end point
  final String END_POINT = "(End Point URL)";

  // create node with label as label and properties.
  final String WRITE_QUERY = "CREATE (n:label {name : 'foo'})";

  // Read the vertex created with label as label.
  final String READ_QUERY = "MATCH (n:label) RETURN n";

  // create the driver
  final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(),
    Config.builder()
          .withEncryption()
          .withTrustStrategy(TrustStrategy.trustSystemCertificates())
          .build());

  // create the session config
  SessionConfig sessionConfig = SessionConfig
    .builder()
    .withFetchSize(1000)
    .withDefaultAccessMode(AccessMode.WRITE)
    .build();

  final StringBuilder resultCollector = new StringBuilder();

  final Session session = driver.session(sessionConfig);

  // run the query as access mode write
  final Transaction tx = driver.session(sessionConfig).beginTransaction();

  // execute the write query and consume the result.
  tx.run(WRITE_QUERY).consume();

  // read the result from the previous write query in a same transaction.
  final List<Record> list = tx.run(READ_QUERY).list();

  // read the result
  for (final Record record : list)
  {
    for (String key : record.keys())
    {
      resultCollector
        .append(key)
        .append(":")
        .append(record.get(key).asNode().toString());
    }
  }

  // commit the transaction and for rollback we can use tx.rollback();
  tx.commit();

  // close the session
  session.close();

  // close the driver.
  driver.close();
}
```

명시적 변형 쿼리는 암시적 변형 트랜잭션과 동일한 동작을 상속합니다.

세션 구성을 전달하지 않으면 트랜잭션은 기본적으로 쓰기 트랜잭션으로 처리됩니다.

충돌에 대해서는 [잠금-대기 제한 시간을 이용한 충돌 해결](transactions-neptune.md#transactions-neptune-conflicts)을 참조하세요.