"products"라는 couchDB 데이터베이스와 양식이있는 프론트 엔드 데이터베이스가 있다고 가정 해 보겠습니다. 이제 사용자가이 데이터베이스의 문서를 양식으로 열면 다른 사용자가이 특정 문서를 편집하지 못하게하고 싶습니다.데이터베이스 클러스터 - 비동기 작업
보통 아주 간단합니다 :
-> read document from couchDB
-> set a variable to true like: { edit : true }
-> save (merge) document to couchDB
-> if someone else tries to open the document he will receive an error, becaus of edit:true.
하지만, 만약에 두 사용자가 동일한 시간에 문서를 열? 이 함수는 두 번 호출되며 두 번째 문서가 열리면 첫 번째 편집에 저장할 시간이 없으므로 false로 편집을 받게됩니다. 그래서 어떻게 이런 행동을 방지 할 수 있을까요?
첫 번째 해결 방법은 다음과 같습니다. 데이터베이스 요청의 큐로 배열을 작성하고 병렬 요청을 허용하지 않으므로 모든 요청이 차례로 처리됩니다. 그러나 내 의견으로는이 시스템은 어느 시점에서 매우 느릴 수 있기 때문에 이것은 나쁜 해결책입니다.
두 번째 해결 방법 : 현재 편집 된 문서의 documentID를 스크립트의 로컬 배열에 저장합니다. 이는 비동기 프로세스가 아니기 때문에 작동하며 두 번째 사용자는 오류를 즉시 받게됩니다.
언젠가는 너무 많은 사용자가 있고이 시스템이 클러스터가 아닌 노드 클라이언트 서버 (데이터베이스가 아닌)에서 실행되어야한다면 어떨까요? 이제는 두 번째 솔루션이 더 이상 작동하지 않습니다. 모든 클러스터 슬레이브는 고유의 documentID 배열을가집니다. 거기서 공유하면 다른 비동기 작업이 끝나고 위와 동일한 문제가 발생합니다.
지금은 아이디어가 없습니다. 대형 클러스터 시스템이 그런 문제를 어떻게 처리합니까?
동시에 문서를 저장하면 충돌이 발생합니다. 따라서 귀하의 솔루션 중 어느 것도 유용하지 않습니다. 업데이트 처리기를 사용하면 충돌 가능성을 줄일 수 있지만 여전히 가능합니다. –