카우치베이스 서버

N1QL에서 자바스크립트까지 - 6부: 고급 주제

이전 블로그에서는 JavaScript에서 N1QL(SQL++)을 실행하는 방법에 대해 설명했습니다. 함수문서 처리 반복기를 통해데이터 조작, 오류 처리를 사용하여 준비된 진술서. 다른 함수 호출, 트랜잭션 및 RBAC 사용 등 JavaScript 라이브러리 조작으로 넘어가기 전에 다루어야 할 몇 가지 고급 주제가 더 있습니다.

함수 호출

자바스크립트 함수는 다른 자바스크립트 함수를 직접 호출할 수 있습니다.

호출된 함수에서 실행되는 모든 N1QL 문은 호출된 함수에서 실행되는 것과 거의 동일한 방식으로, 정확히 동일한 제한을 받으며 실행됩니다. 결과는 스택 위아래로 자유롭게 이동할 수 있으며, 호출된 함수에서 발생한 모든 예외는 스택 아래로 내려가 호출된 N1QL 요청으로 전달됩니다(어딘가에서 포착되어 처리되지 않는 한).

이것은 N1QL UDF를 호출하는 N1QL 문을 실행하는 것보다 확실히 더 실용적인 함수 호출 방법입니다. 함수를 직접 호출하면 실행 함수 를 사용하면 N1QL 계층을 완전히 우회하고 JavaScript에서 N1QL로, 다시 JavaScript로 전환하는 데 필요한 모든 리소스를 절약할 수 있습니다. 이렇게 하면 모든 데이터를 직접 이동하지 않고 반복자를 통해 이동해야 하는 컨텍스트 전환 비용이 줄어들고, 호출이 진행되는 동안 반복자를 열어 두어야 하는 번거로움도 줄어듭니다.

함수를 호출하는 N1QL 실행

N1QL UDF를 직접 호출하는 N1QL 문을 실행하는 경우가 있는데, 이러한 UDF는 그 자체가 자바스크립트 함수일 수도 있습니다.

이는 당연히 예상되는 일이며 지금까지 설명한 모든 것과 똑같은 방식으로 작동합니다.

주의해야 할 유일한 제한 사항은 자바스크립트가 실행할 수 있는 모든 N1QL 문은 기본 요청을 실행하는 동일한 서버에서 실행된다는 것입니다. 각 JavaScript 함수 호출은 새로운 JavaScript 워커를 사용하므로 중첩된 N1QL UDF 호출이 많을수록 사용할 수 있는 워커가 줄어들고 결국 함수가 실패하게 됩니다:

어떤 결과가 나옵니다:

중첩 제한은 고정되어 있지 않으며 각 중첩 호출이 실행될 때 사용 가능한 JavaScript 워커의 수에 따라 달라지며, 일반적으로 노드에 더 많은 JavaScript 활동이 있을수록 이 제한은 더 낮아집니다.

위의 예에서 노드에는 48명의 작업자가 있었고 25번째 호출에서 실패했습니다.

RBAC

자바스크립트 함수의 일부로 N1QL을 실행하려면 함수를 실행하는 사용자에게 작업을 수행할 수 있는 적절한 권한이 있어야 합니다(삽입, 선택, ...) 함수가 참조하는 객체의 함수에서 지정합니다.

함수를 실행하는 사용자의 신원은 런타임까지 알 수 없으므로, 함수를 실행하는 사용자에게 애초에 자바스크립트 함수를 실행할 권한이 부여되었다고 가정하고 함수가 실행될 때만 권한 오류가 발생하게 됩니다!

이는 다른 데이터베이스 엔진이 수행하는 작업과 일치합니다.

부작용

표현식의 일부로 실행되는 함수는 부작용을 가질 수 없습니다. 즉, 해당 함수의 일부로 DML을 실행할 수 없습니다. 이는 다른 데이터베이스 엔진이 하는 것과 일치하며 합리적입니다. 여러분은 선택 문을 사용하여 자바스크립트 함수를 사용하여 뒤에서 데이터를 삽입할 수 있습니다.

함수가 저장소를 조작하도록 하는 유일한 방법은 함수를 개별적으로 실행하는 것입니다. 실행 함수 문을 사용합니다.

거래

함수가 부작용을 가질 수 있는 기능으로 실행되는 경우, 즉, 자바스크립트 함수 내에서 트랜잭션 N1QL 문을 실행하는 것은 완벽하게 합법적입니다. 실행 함수 문을 사용합니다. 이 함수는 함수를 실행하기 전에 시작된 트랜잭션에서 DML을 실행하거나, 트랜잭션을 시작하거나, 트랜잭션을 커밋하거나 롤백하거나, 또는 이들의 합법적인 조합을 실행할 수 있습니다.

한 가지 명심해야 할 것은 N1QL 문과 반복자는 트랜잭션의 내부 또는 외부에만 존재하고 중간에는 존재하지 않는다는 점입니다. 즉, 트랜잭션 이전에 선택 문을 시작했지만 모든 값을 소비하지 않은 경우 트랜잭션이 시작되는 즉시 해당 반복기가 닫힙니다. 결과를 반환하는 DML 문(트랜잭션이 시작되기 전에 완료됨)도 마찬가지이며, 트랜잭션이 커밋되거나 롤백될 때도 유사한 동작이 적용됩니다.

여기에는 그럴 만한 이유가 있으며, 이러한 동작은 일반적으로 데이터베이스 엔진에서 발생하는 현상과 일치합니다. 그 이유는 트랜잭션 경계에서 문이 살아남도록 허용하면 선택 문은 트랜잭션 변경 사항에 액세스할 수 없고 DML 문은 전체 롤백이 불가능하기 때문입니다.

의심의 여지를 없애기 위해, 루프를 처리하는 루프 내부에서는 트랜잭션을 시작할 수 없습니다. 선택 이터레이터가 트랜잭션이 시작되는 즉시 닫히기 때문입니다. 전체 외부 선택 가 트랜잭션 내부에 있어야 합니다.

결론

이 블로그에서는 JavaScript 함수 내에서 N1QL을 실행하는 것과 관련된 주요 주제를 다뤘습니다. 다음 블로그에서는 자바스크립트 라이브러리 관리의 새로운 기능에 대해 집중적으로 다룰 예정입니다.

 

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

작성자

게시자 마르코 그레코, 소프트웨어 아키텍트, 카우치베이스

전생에 마르코는 이탈리아 최대 방사선 치료 기관에서 CTO, 방사선 물리학자, 소프트웨어 설계자, 시스템 관리자, DBA, 트레이너, 일반 관리자로 일했습니다. 직업과 국가를 바꾼 그는 처음에는 Informix에서, 나중에는 IBM에서 20년 이상 다양한 지원 및 개발 직책을 맡다가 마침내 과감히 Couchbase에 합류하여 N1QL에서 금을 만드는 데 도움을 주었습니다. 그는 여러 개의 특허를 보유하고 있으며 직접 오픈 소스 프로젝트를 저술하기도 했습니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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