2014-05-23 5 views
4

ACID 트랜잭션을 수행하는 노드 j에 대한 TokuMX 드라이버를 알고 있습니까?ACID는 Nodejs + Tokumx (mongodb) + Nodejs 용 Mongodb 드라이버와 어떻게 처리합니까?

저는 MongoDB 포크와 비슷한 API 인 TOKUMX을 사용하고 싶습니다. mongo와 같은 API를 사용하지만 일부 기능이 향상되었습니다. 즉 실제 ACID 트랜잭션을 사용합니다. 네이티브 형식의 MongoDB는 ACID를 허용하지 않습니다. 그러나 TOKUMX는 그렇습니다.

그래서 Nodejs에 내 APP를 작성합니다. TokuMX 데이터베이스와 통신하는 데 필요한 드라이버는 노드 몽골어을 사용합니다. 좋은 소식은 해당 드라이버를 사용하여 데이터베이스에 모든 명령을 보낼 수 있다는 것입니다. nodeJS 코드

: 예를 들어, 나는 다음 10 배, 그 일을하지 ACID 트랜잭션처럼 그 프로그램 코드를 매우 빠르게 여러 번 호출하고 때

mycollectionblabla.runCommand('beginTransaction', function(err, res) { .... 
mycollectionblabla.insert .... 
mycollectionsblabla.runCommand('commitTransaction', function(err4, res4){... 

문제가있다. 그리고 그것은이

paralell에서
runCommand('beginTransaction'... 

, 그리고 물론

runCommand('commitTransaction', ... 

실패하는 시작! 그것이라고하기 때문에 : 거래는 이미 존재하며 또한 은 위탁 거래가 없다고 말합니다 ... !!!

나를 괴롭히는 문제가 있습니까? ACID 거래를 만들기 위해 어떻게 문제를 해결할 수 있습니까?

ACID 트랜잭션을 수행하는 nodejs 용 TokuMX 드라이버를 알고 계십니까?

답변

5

node.js가 작동하는 방식과 TokuMX 다중 문장 트랜잭션이 작동하는 방식에 근본적인 문제가 있습니다.

TokuMX에서 다중 명령문 트랜잭션 (beginTransaction)은 명령을 실행하는 클라이언트 연결과 연결됩니다. 이후에 동일한 연결에서 수행 된 모든 작업은 다음 rollbackTransaction 또는 commitTransaction 명령까지 트랜잭션의 일부로 간주됩니다.

트랜잭션을 시작하고 다른 스레드가 연결을 사용하면 해당 작업이 트랜잭션의 일부가됩니다. 또한 스레드를 시작한 다음 다른 연결로 전환하면 스위치 이후의 작업이 트랜잭션과 제대로 연관되지 않습니다.

우리가이 모델을 선택한 이유는 대부분의 운전자에게 의미가 있다는 것입니다. 명시 적 스레딩 모델을 사용하는 언어로 된 대부분의 드라이버에서 연결 풀링을 사용하면 주어진 실행 스레드에 대한 연결을 예약하기위한 드라이버 메커니즘이 있습니다. start_request in PyMongo 또는 RequestStart in the MongoDB C# driver. 이러한 드라이버에서 TokuMX 트랜잭션을 사용하려는 스레드는 예약 된 연결 컨텍스트 내에서 그렇게해야합니다.

node.js에서 현재 드라이버 (AFAIK)를 사용하면 논리적 코드 그룹이 독점적으로 단일 트랜잭션과 연결할 수 없습니다. 이는 논리적 그룹의 코드를 여러 콜백을 통해 연결을 연결할 수있는 "스레드"로 묶는 node.js 실행 모델 자체에 좋은 개념이 없기 때문입니다. 간단히 말해 노드에 "beginTransaction 명령을 실행하고 다른 사람이이 연결을 사용하지 않도록하고, 콜백을 호출 할 때 연결에 대한 참조를 받아야 더 많은 것들을 사용할 수 있습니다"라고 말할 방법이 없습니다.

이제 다중 명령문 트랜잭션을 제외하면 node.js 드라이버를 사용하여 TokuMX에서 얻을 수있는 일련의 트랜잭션 의미론이 있습니다. 모든 쿼리는 여전히 MVCC 스냅 샷을 사용하며 모든 일괄 처리 된 삽입과 다중 문서 업데이트 및 삭제는 서로 직렬로 분리되어 있으며 여러 문서에서도 원 자성입니다. sharded 환경에서 이것들이 완화되어 있다는 것을 명심하십시오; 트랜잭션 의미론은 현재 샤드 경계를 넘지 않는다.

이 문제에 대해 조사한 누군가가 BlueRival/node-tokumx-native 프로젝트를 진행하고 있습니다. one of their github issues에 따르면, 그들은 곧이 문제에 대한 연구를 시작해야하지만 나는 그들과 직접 접촉하지 않아서 일정이나 계획을 말할 수 없다.

지금은 다른 드라이버를 사용해 보거나 TokuMX의 단일 명령문 트랜잭션 의미론이 충분하도록 응용 프로그램을 작성하는 것이 좋습니다.

면책 조항 : 저는 TokuMX 엔지니어입니다.

+0

TokenMX 대신 TokuDB를 사용하려고합니다. 그리고 NodeJS의 경우, mysql-queues라는 NPM 모듈을 사용할 것이다. 아마 내 애플 리케이션에 대한 거래를 얻을 수있는 그런 식으로. 최고의 인사 – europeanguy

+0

나는 똑같은 문제에 직면 해있다. 두 사용자가 동시에 트랜잭션 (동시성)을 시도했습니다. 그래서 그들은 runCommand ({beginTransaction : 1})을 2 번 실행했습니다. 마지막으로'트랜잭션이 이미 있습니다 .' – lvarayut

+1

예, 사용자가 동일한 연결을 사용하고 있음을 의미합니다. – leif