2015-01-23 2 views
2

나는 복수 클라이언트가 동시에 읽는 큐로 requests 콜렉션을 사용하고 있습니다. 각 클라이언트는 한 번에 하나의 문서를 requests에서 읽고 컬렉션에서 제거합니다. 1 명의 고객 만 각 문서를 읽고 처리 할 수 ​​있습니까?MongoDB의 동시성

클라이언트는 Python으로 pymongo로 작성됩니다.

+0

낙관적 잠금은 현재 DBA 중심의 접근 방식을 될 수 @Sammaye 유일한 진짜 방법 – Sammaye

+0

이지만, 다행히 MongoDB를 염두에 프로그래머로 구축하고이를 수용 할 수 있었다. –

+0

@NeilLunn 그는 큐에서 읽는 중이기 때문에 자신의 문제를 단순화했다는 느낌이 들었다. – Sammaye

답변

2

여기에 기본 절차는 .findAndModify() 사용하는 것입니다

이 파이썬 코드가 아닙니다 것을 용서하지만, 구조는 동일하고 합리적인 보편적 인 예입니다. 세 가지 문서 :

{ "_id": 1 } 
{ "_id": 2 } 
{ "_id": 3 } 

그래서 핵심 방법에서, 당신은 단지 각 _id에서 "제거"인수를 호출합니다. 다른 프로세스가 동시에이 작업을 수행 할 수는 없습니다.

db.collection.findAndModify({ 
    "query": { "_id": 1 }, 
    "remove": true 
}) 

삭제 된 문서를 반환하거나 전혀 반환하지 않습니다. 좀 더 "동시성"증거를 들어


다시 여기에 Node.js를 코드를 변명하지만 난 빠른 예를 들어 일부 화려 "트위스트"유형 코드를 할 수있는 프레임에 아니에요. 문서 당이 개 시도의 3 여기 실행 여섯 개 시도 중 그래서

Removing: 3, { _id: 3, __v: 0 } 
Removing: 1, { _id: 1, __v: 0 } 
Removing: 3, null 
Removing: 1, null 
Removing: 2, { _id: 2, __v: 0 } 
Removing: 2, null 

: (가능한 다양한 순서)

var async = require('async'), 
    mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var testSchema = new Schema({ 
    "_id": Number, 
}); 

var Test = mongoose.model('Test', testSchema, 'test'); 

mongoose.connect('mongodb://localhost/async'); 

async.series(
    [ 
    // Clear test collection 
    function(callback) { 
     Test.remove({},callback) 
    }, 

    // Insert some data 
    function(callback) { 
     async.each([1,2,3],function(num,callback) { 
     Test.create({ "_id": num },callback); 
     },callback); 
    }, 

    // Now run test in parallel 
    function(callback) { 
     async.each([1,1,2,2,3,3],function(num,callback) { 
     Test.findOneAndRemove(
      { "_id": num }, 
      function(err,doc) { 
      if (err) callback(err); 
      console.log("Removing: %s, %s", num, doc); 
      callback(); 
      } 
     ); 
     },callback); 
    } 
    ], 
    function(err) { 
    process.exit(); 
    } 
); 

그리고 결과 : 그것은 비록 동시성 테스트의 목적을 제공 시도는 실제로 성공하고 결과를 스택에서 제거합니다.

원하는 결과를 얻는 것이 원칙입니다. 이 문서에 따르면

db.requests.findAndModify() 

을 찾고있는 것처럼

+0

이것은 훌륭한 대답이었습니다. 감사합니다. 파이썬으로 아주 쉽게 적용 할 수 있습니다. – rgrasell