SQL++/N1QL 쿼리

N1QL 트랜잭션 : 탄력적, 확장성, 분산형

SQL은 오늘날 개발자가 사용할 수 있는 유일한 22세기 언어입니다.

초록

관계형 데이터베이스 시스템에서 SQL은 선언적 쿼리 언어 그 이상입니다. 여기에는 절차적 언어(T-SQL, PL/SQL 등)가 포함되며 트랜잭션과 그 의미를 정의합니다. 쿼리 언어로서의 SQL은 에서도 비합리적으로 효과적이지 않습니다. NoSQL 데이터베이스 시스템. 그러나 트랜잭션을 지원하는 NoSQL 데이터베이스 시스템은 거의 없습니다. 지원하는 시스템도 제한 사항이 많거나 트랜잭션 내에서 SQL 작업을 지원할 수 없는 경우가 많습니다. Couchbase N1QL의 트랜잭션을 소개하고 설명합니다: JSON용 SQL. N1QL 트랜잭션은 다중 문서, 다중 버킷, 다중 범위, 다중 수집 및 다중 DL-statement 등 모든 것을 지원합니다.

N1QL 트랜잭션은 Couchbase 7.0 베타 버전에서 사용할 수 있습니다. 여기에서 다운로드할 수 있습니다: https://www.couchbase.com/downloads. 문서 보기 여기.

소개

N1QL JSON을 조작하는 선언적 언어입니다. 카우치베이스는 모든 문서를 데이터 서비스에 저장합니다. 쿼리 서비스는 쿼리 실행 쿼리를 최적화하고 실행 계획을 생성한 다음 데이터, 인덱싱 및 FTS를 사용하여 실행합니다. 그리고 카우치베이스 SDK 를 통해 쿼리 상호 작용 프로토콜을 구축합니다. N1QL DML 문은 다음과 같습니다. 선택, 삽입, 업데이트, UPSERT, 삭제MERGE.  

N1QL 트랜잭션

다음은 RDBMS 및 Couchbase N1QL의 트랜잭션 예제입니다.

거래
MySQL 데이터베이스(Oracle, SQL Server, Informix 및 DB2에서 문이 동일/유사함)
카우치베이스 데이터베이스(체셔-캣)
데이터 삽입. MySQL의 튜플, Couchbase의 JSON 문서
INSERT INTO customer(cid, name, balance) VALUES(4872, "John Doe", 724.23);
INSERT INTO customer(cid, name, balance) VALUES(1924, "Bob Stanton", 2735.48);
고객에 삽입
VALUES("cx4872", {"cid": 4872, "name":"John Doe", "balance":724.23});
고객에 삽입
VALUES("cx1924", {"cid": 1924, "name":"Bob Stanton", "balance":2735.48});
간편 거래, 직불 및 신용. 중간 선택은 자체 업데이트(RYOW)를 읽어야 합니다.
거래를 시작합니다;
업데이트 고객 SET 잔액 = 잔액 + 100 WHERE cid = 4872;
고객으로부터 cid, 이름, 잔액을 선택합니다;
UPDATE customer SET balance = balance - 100 WHERE cid = 1924;
고객으로부터 cid, 이름, 잔액을 선택합니다;
COMMIT ;
거래를 시작합니다;
업데이트 고객 SET 잔액 = 잔액 + 100 WHERE cid = 4872;
고객으로부터 cid, 이름, 잔액을 선택합니다;
UPDATE customer SET balance = balance - 100 WHERE cid = 1924;
고객으로부터 cid, 이름, 잔액을 선택합니다;
COMMIT ;
부분 롤백이 있는 두 번째 트랜잭션입니다.
거래를 시작합니다;
업데이트 고객 SET 잔액 = 잔액 + 100 WHERE cid = 4872;
고객으로부터 cid, 이름, 잔액을 선택합니다;
세이브포인트 s1;
UPDATE customer SET balance = balance - 100 WHERE cid = 1924;
고객으로부터 cid, 이름, 잔액을 선택합니다;
세이브포인트로 작업 롤백 s1;
고객으로부터 cid, 이름, 잔액을 선택합니다;
COMMIT ;
거래를 시작합니다;
업데이트 고객 SET 잔액 = 잔액 + 100 WHERE cid = 4872;
고객으로부터 cid, 이름, 잔액을 선택합니다;
세이브포인트 s1;
UPDATE customer SET balance = balance - 100 WHERE cid = 1924;
고객으로부터 cid, 이름, 잔액을 선택합니다;
세이브포인트로 작업 롤백 s1;
고객으로부터 cid, 이름, 잔액을 선택합니다;
COMMIT ;

큰 차이를 느끼지 못하셨다면 그 이유는 차이가 없기 때문입니다. 

N1QL 트랜잭션 명세서

N1QL은 모든 형태의 DML 문이 포함된 트랜잭션 집합을 트랜잭션합니다: 제한 없음. 거래 보호는 새 명세서에서 발급됩니다: 시작/시작, 커밋, 롤백, 저장점.

트랜잭션 시작(작업 시작과 동일)

이 문은 새 트랜잭션을 시작하고, 새 트랜잭션 ID를 할당하고, 호출자에게 트랜잭션 ID를 반환합니다. 나머지 트랜잭션을 성공적으로 실행하기 위해 SDK, 도구(예: CBQ 셸)가 따르는 두 가지 규칙이 있습니다.

  1. 트랜잭션 내의 모든 후속 문에서 이 트랜잭션 ID를 매개변수로 전송합니다. 이렇게 하면 쿼리 서비스에서 해당 문이 특정 트랜잭션의 일부로 실행되어야 한다는 것을 알 수 있습니다.
  2. 카우치베이스는 여러 개의 쿼리 서비스 노드를 가질 수 있지만, 단일 트랜잭션은 단일 쿼리 노드에서 실행됩니다. 모든 쿼리 노드에서 새 트랜잭션을 시작할 수 있습니다. 그러나 해당 단일 트랜잭션에 대한 나머지 문은 매우 동일한 쿼리 노드로 전송되어야 합니다.
커밋 트랜잭션 또는 커밋 작업;

트랜잭션의 모든 변경 사항을 데이터 저장소에 커밋합니다. 이것은 트랜잭션을 카우치베이스 키-값 데이터 저장소에 분산 커밋하는 것입니다. 이 커밋은 모든 카우치베이스 내구성 옵션을 사용할 수 있습니다. 이것은 여전히 분산 시스템이며 천문학과 마찬가지로 드문 일이 자주 발생합니다. 장애가 발생하면 전체 트랜잭션이 자동으로 롤백되고 애플리케이션은 트랜잭션을 다시 시도해야 합니다. 네트워크 장애, 노드 장애, 노드 과부하, 쓰기-쓰기 충돌 등 다양한 이유로 실패가 발생할 수 있습니다. 카우치베이스 직접 쓰기가 낙관적인 것처럼 동시 쓰기로 인해 실패가 발생할 수 있습니다. CAS 충돌의 경우 쓰기 충돌로 인해 N1QL 트랜잭션이 실패할 수도 있습니다. 저희는 낙관적인 동시성 거래에 대한 접근 방식입니다.

롤백 트랜잭션 또는 롤백 작업;

애플리케이션이 롤백을 발행하면 트랜잭션 내에서 수행된 모든 수정 사항이 롤백됩니다.

위의 예제에서 보았듯이 N1QL은 다음과 같은 기능도 지원합니다. 저장 포인트 를 사용하여 트랜잭션 내의 저장 지점으로 롤백할 수 있습니다. 애플리케이션 관점에서 볼 때 이러한 기능은 RDBMS와 동일하게 작동합니다.

트랜잭션 기능

거래는 단순한 진술이 아니라 의미와 보증에 관한 것입니다. 따라서 ACID 정의. 앞서 커밋에 대한 원자성에 대해 이야기했습니다. 이에 대해 조금 더 이야기해 보겠습니다.

원자성 는 전체 트랜잭션과 각 문에 모두 필요합니다. DML 문은 실패 시 원자적으로 롤백되지만 트랜잭션 자체는 열려 있으므로 계속 진행할 수 있습니다. 실패의 예로는 삽입 시 문서 키 충돌이 있습니다.

일관성 는 각 문에 대해 제약 조건이 일관되게 적용되도록 합니다. Couchbase의 유일한 제약 조건은 문서 키에 대한 고유 제약 조건입니다. N1QL은 삽입된 각 키의 기존 존재 여부를 확인하고 충돌이 있는 경우 문을 롤백합니다. 낙관적 동시성 제어를 사용한다는 점을 기억하세요. 즉, 삽입이 성공한 후에도 다른 세션이 삽입과 커밋 사이에 삽입되었을 수 있기 때문에 커밋 단계에서 쓰기-쓰기 충돌이 발생할 수 있습니다. 이러한 실패 시 트랜잭션을 다시 시도해야 합니다.

격리

저희는 커밋된 읽기 격리 수준을 지원합니다. 읽고 평가되는 모든 데이터는 인덱스와 데이터 저장소에 커밋된 데이터입니다. 기본적으로 엄격한 요청_플러스 인덱스 읽기에서 일관성을 유지합니다. 즉, 주어진 술어에 대해 인덱스의 최신 데이터를 사용하여 문서를 선택/업데이트/삭제할 수 있는 자격을 부여합니다. 그런 다음 추가 단계를 거쳐 KV 저장소에서 문서를 가져오고 술어를 다시 적용하여 최신 커밋된 버전의 문서가 자격이 부여되고 업데이트되었는지 확인합니다.

성능을 고려하지 않았다면 모두가 직렬화 가능한 트랜잭션을 사용했을 것입니다.) 스캔 일관성을 다음과 같이 변경할 수 있습니다. 무제한 를 사용하여 인덱스 스캔 성능을 향상시킬 수 있습니다.

내구성

N1QL은 모든 내구성 옵션 분산 데이터베이스의 내구성을 보장하기 위해 Couchbase 데이터 저장소와 기능을 제공합니다.

동시성일반적으로 데이터베이스 트랜잭션은 비관적 또는 낙관적 접근 방식을 사용합니다. 동시성 제어. 기존의 단일 노드 데이터베이스는 충돌을 피하기 위해 비관적인 동시성 제어 방식을 따릅니다. 이 접근 방식은 Oracle RAC, DB2 Sysplex와 같은 일부 멀티노드 구현에도 적용됩니다. 다중 노드 구현은 가능하지만 값비싼 Infiniband, 맞춤형 하드웨어 등이 필요합니다.

최적의 동시성 제어는 튜플의 각 기본 단위(rdbms의 행, 카우치베이스의 문서)의 버전이 수정하기 위해 읽은 버전을 기억하고 쓰기 중에 버전이 변경되었는지 확인합니다. 실제로 충돌이 발생하면 전체 트랜잭션을 다시 시도해야 합니다. 이 접근 방식의 장점은 잘 설계된 애플리케이션에서는 충돌이 거의 발생하지 않는다는 것입니다. 즉, 동일한 나노초 단위로 현금을 인출하거나 계좌 간에 돈을 이체하지 않습니다. 드문 경우지만 재시도가 허용됩니다.

N1QL 쿼리 서비스의 동시성

Couchbase N1QL은 낙관적인 동시성 제어를 사용합니다. 각 트랜잭션은 업데이트해야 하는 문서를 읽고, 업데이트하고, 업데이트된 문서를 비공개로 유지합니다. 거래당 캐시에 저장합니다. 후속 문을 실행하면 쿼리 서비스는 트랜잭션 내에서 업데이트된 문서를 인식하고 인덱스/데이터에 반영된 이전 버전 대신 해당 버전을 사용합니다. 이것이 바로 읽기-쓰기 지원을 제공하는 방식입니다. 이것은 모델링되어 모든 DML 문, 모든 작업(select, join, project, aggregate, nest, unnesst 등)이 모두 일관되고 중요한 트랜잭션의 기능을 제공하는 이 RYOW 혜택을 받도록 합니다. 애플리케이션이 트랜잭션을 수행하는 동안(읽기와 쓰기를 모두 수행), 트랜잭션 내에서 커밋 시간까지 업데이트를 읽고 캐싱합니다. 이것이 트랜잭션의 읽기 단계이며, 이러한 접근 방식 때문에 커밋(쓰기 단계)까지는 여러 트랜잭션 또는 트랜잭션 내의 여러 쿼리 노드 간에 조정이 이루어지지 않습니다. 이것은 Couchbase에서 분산 트랜잭션의 성능과 확장성을 보장합니다. 그리고 이 모든 것이 다음과 동시에 작동합니다. 카우치베이스 분산 트랜잭션 우리 6.5에서 출시.

조정은 확장 가능한 시스템의 골칫거리입니다. 피터 베일리스

다음 단계

2020년 11월에 카우치베이스 7.0 베타 버전이 출시될 예정이라고 방금 발표했습니다. 자세한 내용은 계속 지켜봐 주세요.

이것은 Couchbase 트랜잭션의 새로운 기능에 대한 간략한 개요입니다. 다음 시리즈에서는 구현, 사용법, SDK 지원, 람다 트랜잭션, Spring 지원 등에 대해 자세히 살펴보겠습니다.

감사

여기서 N1QL 트랜잭션을 발표하게 되어 기쁩니다. 이는 설계 및 구현을 위해 Couchbase 쿼리, SDK 및 QE 팀에서 집중적으로 작업하고 협업한 결과입니다. 감사합니다!

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 케샤브 머시

케샤브 머시는 Couchbase R&D의 부사장입니다. 이전에는 MapR, IBM, Informix, Sybase에서 근무했으며 데이터베이스 설계 및 개발 분야에서 20년 이상의 경력을 쌓았습니다. IBM Informix에서 SQL 및 NoSQL R&D 팀을 이끌었습니다. Couchbase에서 두 번의 President's Club 상을, IBM에서 두 번의 우수 기술 업적상을 수상했습니다. 인도 마이소르 대학교에서 컴퓨터 과학 및 공학 학사 학위를 받았으며, 10개의 미국 특허를 보유하고 있고 3개의 미국 특허를 출원 중입니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.