View a markdown version of this page

Neptune에서의 Gremlin 트랜잭션 - Amazon Neptune

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

Neptune에서의 Gremlin 트랜잭션

Gremlin 트랜잭션이 실행되는 컨텍스트는 여러 가지가 있습니다. Gremlin을 사용할 때는 작업 중인 컨텍스트와 그 의미를 이해하는 것이 중요합니다.

  • Script-based   –   요청은 다음과 같은 텍스트 기반 Gremlin 문자열을 사용하여 이루어집니다.

    • Java 드라이버 및 Client.submit(string) 사용.

    • Gremlin 콘솔 및 :remote connect 사용.

    • HTTP API 사용.

  • Bytecode-based   –   요청은 Gremlin Language Variants(GLV)의 직렬화된 일반 Gremlin 바이트코드를 사용하여 이루어집니다.

    Java 드라이버 g = traversal().withRemote(...)를 사용하는 경우를 예로 들 수 있습니다.

위 컨텍스트 중 하나에는 세션 없이 또는 세션에 바인딩된 상태로 전송되는 요청의 추가 컨텍스트가 있습니다.

참고

Gremlin 트랜잭션은 항상 커밋되거나 롤백되어야 서버 측 리소스를 릴리스할 수 있습니다. 트랜잭션 중에 오류가 발생하는 경우 실패한 특정 요청뿐만 아니라 전체 트랜잭션을 다시 시도하는 것이 중요합니다.

세션 없는 요청

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

스크립트의 경우 단일 요청으로 전송된 하나 이상의 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();

세션에 바인딩된 요청

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

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

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(); }

스크립트 기반 세션의 경우 로 클라이언트를 닫으면 트랜잭션이 client.close() 커밋됩니다. 스크립트 기반 세션에서 사용할 수 있는 명시적 롤백 명령은 없습니다. 롤백을 강제로 수행하려면 클라이언트를 닫기 g.inject(0).fail('rollback') 전과 같이 쿼리를 실행하여 트랜잭션이 실패할 수 있습니다.

참고

의도적으로 롤백을 강제하는 오류를 발생시키는 데 g.inject(0).fail('rollback')사용되는와 같은 쿼리는 클라이언트에 예외를 생성합니다. 클라이언트를 닫기 전에 결과 예외를 포착하여 삭제합니다.

바이트코드의 경우 트랜잭션을 명시적으로 제어하고 세션을 투명하게 관리할 수 있습니다. 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로 작성되었지만 다른 언어에서도이 tx() 구문을 사용할 수 있습니다. 언어별 트랜잭션 구문은 Java, Python, Javahttps://tinkerpop.apache.org/docs/current/reference/#gremlin-javascript-transactionsscript, .NETGo에 대한 Apache TinkerPop 설명서의 트랜잭션 섹션을 참조하세요.

주의

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

바이트코드 커밋 및 롤백에 대한 제한 시간 동작

tx() 구문과 함께 바이트코드 기반 트랜잭션을 사용하는 경우 commit()rollback() 작업에는 쿼리 제한 시간 설정이 적용되지 않습니다. 를 통해 설정된 전역 neptune_query_timeout 파라미터 및 쿼리당 제한 시간 값은 이러한 작업에 evaluationTimeout 적용되지 않습니다. 서버에서 commit() 및는 완료되거나 오류가 발생할 때까지 시간 제한 없이 rollback() 실행됩니다.

클라이언트 측에서 Gremlin 드라이버의 tx.commit()tx.rollback() 호출은 서버가 응답할 때까지 완료되지 않습니다. 언어에 따라 차단 호출 또는 해결되지 않은 비동기 작업으로 매니페스트될 수 있습니다. 드라이버는 이러한 호출을 제한하는 기본 제공 제한 시간 설정을 제공하지 않습니다. 이러한 트랜잭션 기능에 대한 동시성 동작에 대한 자세한 내용은 특정 Gremlin 언어 변형에 대한 API 설명서를 참조하세요.

중요

commit() 또는 rollback() 호출이 예상보다 오래 걸리는 경우 동시 트랜잭션의 잠금 경합으로 인해 차단될 수 있습니다. 잠금 충돌에 대한 자세한 내용은 섹션을 참조하세요잠금-대기 제한 시간을 이용한 충돌 해결.

애플리케이션이 commit() 또는를 기다리는 시간을 제한해야 하는 경우 언어의 동시성 기능을 사용하여 클라이언트 측 제한 시간을 적용할 rollback()수 있습니다. 클라이언트 측 제한 시간이 실행되면 서버가 작업을 계속 처리합니다. 서버 측 작업은 완료될 때까지 작업자 스레드를 보관합니다. 클라이언트 측 제한 시간이 지나면 트랜잭션 상태가 불확정적이기 때문에 연결을 닫고 기존 연결을 재사용하지 않고 새 연결을 생성합니다.

서버 측 트랜잭션 정리

클라이언트가 커밋하거나 롤백하지 않고 트랜잭션을 연결 해제하거나 중단하면 Neptune에는 분리된 트랜잭션을 최종적으로 정리하는 서버 측 메커니즘이 있습니다.

  • 세션 제한 시간   - 최대 세션 수명(10분)보다 오래 유휴 상태로 유지되는 바이트 기반 세션이 종료되고 모든 열린 트랜잭션이 롤백됩니다.

  • 연결 유휴 제한 시간   -   Neptune은 약 20분 동안 유휴 상태인 WebSocket 연결을 닫습니다. 연결이 닫히면 서버는 해당 연결과 연결된 모든 열린 트랜잭션을 롤백합니다.

이러한 정리 메커니즘은 안전망입니다. 트랜잭션 작업을 마치면 항상 트랜잭션을 명시적으로 커밋하거나 롤백하는 것이 좋습니다.