2013-11-22 4 views
2
Account has embedded 
    Transactions 
    amount (positive for received transactions, negative for outgoing transactions) 

사용자가 돈을 보내려고합니다. 충분한 돈이 있는지 확인하기 위해 계좌 잔고를 계산해야합니다. 의사 코드 :MongoDB로 돈을 이전하는 방법은 무엇입니까?

두 개의 동시 mongo 연결이 모두 쿼리 1을 통과하고 쿼리 2를 진행할 가능성은 없습니까? 사용자의 잔고가 1이고 쿼리 1을 동시에 통과 한 두 개의 동시 송금 요청 1이 트랜잭션에 성공적으로 추가되었다고 가정 해보십시오. 결과적으로 사용자는 -1의 균형을 맞 춥니 다.

어떻게 예방할 수 있습니까?

+2

당신을 havent 한이 바라 보았다? – Sammaye

+0

멋진 솔루션 인 것 같습니다. 별도의 잠금 컬렉션을 사용하는 것이 어떻게 현재 패턴 업데이트와 비교되는지 궁금합니다. – randomguy

+0

현재가 하나의 문서에 대한 업데이트가 여러 문서가 아닌 동일한 문서에서만 작동하는 경우 – Sammaye

답변

1

업데이트 패턴을 사용하는 방법은 여기를 참조하십시오. http://docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/ 아마도 "해당 페이지의베이스 근처에서 논의 된"응용 프로그램이 각 업데이트 작업시 증가하는 문서에 버전 변수 추가 "제안이 있습니까? 트랜잭션의 배열뿐만 아니라 문서의 필드에서 현재 잔액을 추적해야 할 것입니다. 따라서 업데이트 섹션에는 버전 필드에 $ inc 1, 밸런스 필드에 +/- 금액의 $ inc 및 배열의 ​​새 트랜잭션 요소에 대한 $ push가 필요할 수 있습니다.

+0

트랜잭션이 별도의 컬렉션에있는 경우 현재 패턴 업데이트가 작동합니까? – randomguy

+1

원래의 질문은 두 개의 동시 클라이언트 스레드가 * 같은 * 문서를 업데이트하려고하면 어떻게되는지 묻고있었습니다. "하나의 단일 트랜잭션이 (1) 하나의 문서에서 돈을 인출하고 (2) 돈을 별도의 문서로, 원자 적으로"어떻게 확장 할 수 있는지 묻는다면, 다음과 같이 2PC와 유사한 접근법이 필요합니다. Sammaye는에 연결했다. – PKD

2

유즈 케이스가 여러 문서에 걸쳐있는 트랜잭션을 필요로 할 때, MongoDB는 둘 이상의 문서가 영향을받을 때 원자 적 연산을 지원하지 않기 때문에 일반적으로 적합하지 않습니다.

가능한 해결 방법은 two-phase-commit입니다.

기본적으로 문서에 추가 필드로 수행 할 작업을 설명으로 추가한다는 의미입니다. 그런 다음 해당 작업을 적용하고 설명을 제거하는 각 문서에 대한 원자 작업을 수행합니다. 이러한 각 단계는 나중에 문서를 쿼리하여 확인되며 트랜잭션의 각 단계는 보류중인 트랜잭션의 추가 수집에서 세 번째 문서에 의해 문서화됩니다. 보류중인 트랜잭션을 확인하고 롤백 할 수 있습니다.

이 방법은 구현하기가 어렵고 상당한 오버 헤드가 있습니다. 이를 구현하기 전에 원시 트랜잭션 지원이있는 데이터베이스 시스템을 사용하지 않는 것이 실제로 좋은 이유가 있는지 실제로 고려해야합니다.

+0

현재 패턴으로 업데이트 하시겠습니까? 더 가벼운가요? – randomguy

+0

@randomguy이 답변은 PKD에 대한 귀하의 의견에 대한 반응으로 두 개의 콜렉션에 영향을 줄 때 어떻게해야하는지 묻습니다. UpdateIfCurrent 패턴은 또 다른 시나리오입니다. 두 스레드가 동일한 개체를 변경하려고합니다. 이것은 간단한 해결책으로 더 간단한 경우입니다. – Philipp

0

내년 여름에는 더 이상 문제가되지 않습니다. MongoDB는 버전 4.0에서 다중 문서 트랜잭션에 대한 지원을 추가 할 예정이므로 RBDMS 시스템과 같은 다중 문서 트랜잭션에서 ACID 보증을 제공 할 예정입니다.

이제 MongoDB 유스 케이스는 함께 작업 할 수있는 모든 케이스에 적합합니다!

확인이 게시물 : http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ : https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb?jmp=community

관련 문제