

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

# 읽기 및 쓰기에 명시적 트랜잭션 모드 사용
<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)
    }
  }
);
```

두 경우 모두 [Neptune 읽기 전용 트랜잭션 체계](transactions-neptune.md#transactions-neptune-read-only)를 사용하여 [`SNAPSHOT` 격리](transactions-isolation-levels.md)가 이루어집니다.

읽기 전용 복제본은 읽기 전용 쿼리만 허용하므로, 읽기 전용 복제본에 제출된 모든 쿼리는 `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)을 참조하세요.

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