복붙노트

[MONGODB] 무엇 MongoDB를가 V4 정말 의미 전에 ACID를 준수 것을하지 않았다?

MONGODB

무엇 MongoDB를가 V4 정말 의미 전에 ACID를 준수 것을하지 않았다?

나는 곰 그래서 나와 함께, 데이터베이스 전문가가 아니라 오전 공식적인 컴퓨터 과학의 배경이 없습니다. 난 당신이 ACID 준수하지 않았다 V4, 이전에 오래된 MongoDB의 버전을 사용하는 경우 발생할 수있는 실제 부정적인 것들의 종류를 알고 싶어요. 이것은 어떤 ACID 준수하지 않는 데이터베이스에 적용됩니다.

나는 MongoDB를이 원자 작업을 수행 할 수 있음을 이해하지만, 그렇지 않은 것이 대부분 성능상의 이유로, "기존의 잠금 및 복잡한 트랜잭션을 지원". 나는 또한 데이터베이스 트랜잭션의 중요성, 그리고 데이터베이스가 은행에 대한 경우의 예를 이해하고, 모든 필요가 동기화 될 것을 몇 가지 기록을 업데이트하고, 당신은이 있다면 트랜잭션이 초기 상태로 되돌리려 정전 신용 구매 등을 동일 있도록

하지만 MongoDB에 대한 대화로 얻을 때 같은 문장 주위 방법 데이터베이스가 실제로 구현 시작 던지기의 기술적 인 세부 사항을 모르는 우리들에게 :

그 부분이 이해를 참조한다 "제대로 저장하지 않습니다"순간 당신 MongoDB를 수있는 좋은 방법입니다 서면에서 정전 권리가 있다면, 10 개 속성을 가진 문서에서 당신에게있는 거 추적 페이지 뷰를 말한다 (특정 레코드에 대한 기회가있다 각), 문서 중 하나는 페이지 뷰 카운터가 "약간"꺼져가는 시간이 지남 수단 속성 ... 5 저장 한. 당신은 얼마나, 당신은 그들이 99.999 %의 정확한 수 있습니다 알고에 의해 알 수 없지만, 100 % 않을 것이다. 이것은 특별히 이것을 MongoDB를 원자 작동하게하지 않는 한, 작업이 원자되었습니다 보장 할 수 없습니다 때문입니다.

내 질문은 그래서, 언제, 왜 MongoDB를 "이 제대로 저장 '하지 않을 수의 정확한 해석은 무엇인가? 그것은 ACID의 어떤 부분을 만족하고, 어떤 상황에서, 어떻게 당신은 당신의 데이터의 0.001 %이 꺼져있을 때 알고하지 않는 이유는 무엇입니까? 이것은 어떻게 든 해결 될 수 없다? 그렇지 않으면,이 기록이 저장되지 않을 수도 있습니다 때문에, MongoDB의에서 사용자 테이블 같은 것들을 저장하지 것을 의미하는 것 같다. 하지만 다시, 그 1 / 1,000,000 사용자는 단지 아니, "다시 가입하려고"해야 할 수 있습니다?

난 그냥 부정적인 일들이 MongoDB를 같은 ACID 준수하지 않는 데이터베이스와 일, 그리고 왜 때 / 어쩌면리스트를 찾고 있어요 이상적 표준 해결 방법이 있는지 (정리 데이터에 대한 백그라운드 작업을 실행하거나, 만, 이것에 대한 등 SQL을 사용하는 등) .

해결법

  1. ==============================

    1.당신이 MongoDB를 잃을 것은 다 모음 (테이블) 거래이다. MongoDB의에서 원자 수정은 하나의 문서에 대해 작업 할 수 있습니다.

    당신이 MongoDB를 잃을 것은 다 모음 (테이블) 거래이다. MongoDB의에서 원자 수정은 하나의 문서에 대해 작업 할 수 있습니다.

    당신이 목록에서 항목을 제거하고 동시에 누군가의 주문에 추가해야하는 경우 - 당신은 할 수 없습니다. 재고 및 주문 - - 그 두 가지 않는 한 같은 문서 (그들은 아마도하지 않는)에 존재한다.

    내가하고 선택할 수있는 두 가지 솔루션을 가지고 일하고 응용 프로그램에서 바로이 같은 문제가 발생했습니다 :

    동기화되지 수 당신이 할 수있는 당신이하고 나머지 비트에 대한 정리 기록에 백그라운드 프로세스를 사용할 수있는 최고로 원자 수정을 사용 최고로 1) 문서를 구조. 예를 들어, 나는 목록에서 항목을 제거하고 원자 수정을 사용하여 동일한 문서의 reservedInventory 배열에 추가합니다.

    이 날은 항상 (그들은 고객이 예약되어 있으므로) 항목은 목록에서 사용할 수없는 것을 알 수 있습니다. 고객이 체크 아웃 때, 나는 다음 reservedInventory에서 항목을 제거합니다. 고객이 카트를 포기 수 있기 때문에 그것의하지 표준 거래하고, 나는 통과 버려진 카트를 발견하고 가능한 재고 풀에 예약 된 재고 뒤로 이동하는 일부 백그라운드 프로세스가 필요합니다.

    이것은 분명히 덜 이상적이지만, MongoDB를 완벽하게 필요에 맞지 않는 큰 응용 프로그램의 그것의 유일한 부분. 게다가, 그것은 완벽하게 지금까지 작동합니다. 이것은 많은 시나리오 가능하지 않을 수도 있지만, 내가 사용하고있는 문서 구조의 때문에, 그것을 잘 맞습니다.

    2) MongoDB를와 함께 트랜잭션 데이터베이스를 사용합니다. 절대적으로 MongoDB를 (또는 다른되는 NoSQL)를시키는 동안 그들을 필요가 최선 무엇을하는 일에 대한 거래를 제공하기 위해 MySQL을 사용하는 것이 일반적입니다.

    # 1 내 솔루션은 장기적으로 일을하지 않는 경우에, 나는 MySQL과 MongoDB의 결합으로하지만 지금은 잘 # 1 정장 내 요구를위한 추가 조사를 할 것이다.

  2. ==============================

    2.그것은 MongoDB를이 ACID 호환 아니라고 실제로 정확하지입니다. 반대로, MongoDB를 문서 수준에서 ACID-compilant이다.

    그것은 MongoDB를이 ACID 호환 아니라고 실제로 정확하지입니다. 반대로, MongoDB를 문서 수준에서 ACID-compilant이다.

    하나의 문서에 대한 모든 업데이트입니다

    무엇 MongoDB를 가지고 있지 않는 것은 거래입니다 - 다시 압연 및 부식을 준수 할 수 있습니다, 다중 문서 업데이트입니다.

    두 단계 커밋을 사용하여, 하나의 문서에 ACID 호환 업데이트의 상단에 거래를 구축 할 수 있습니다.

  3. ==============================

    3.좋은 설명은 "커밋 스타 벅스 있지 않음을 사용하여 두 단계"에 포함되어 있습니다.

    좋은 설명은 "커밋 스타 벅스 있지 않음을 사용하여 두 단계"에 포함되어 있습니다.

    그것은되는 NoSQL 데이터베이스에 대한 아니지만, 때때로 당신이 거래를 잃거나 일시적으로 일관성이없는 상태에서 데이터베이스가 감당할 수있는 점을 설명한다.

    나는 필요 "고정"할 것을 뭔가 생각하지 않을 것이다. 수정은 ACID 호환 관계형 데이터베이스를 사용하는 것입니다. 당신은 그 동작은 응용 프로그램 요구 사항을 충족 할 때 NoSQL의 대안을 선택합니다.

  4. ==============================

    4.나는 다른 사람들이 이미 좋은 답변을했다 생각합니다. 그러나 나는 (http://ravendb.net/ 같은) ACID NOSQL DB에 있다는 것을 추가하고 싶습니다. ACID와 관계 대 더 ACID ... - 그래서뿐만 아니라 의사 결정 NOSQL입니다

    나는 다른 사람들이 이미 좋은 답변을했다 생각합니다. 그러나 나는 (http://ravendb.net/ 같은) ACID NOSQL DB에 있다는 것을 추가하고 싶습니다. ACID와 관계 대 더 ACID ... - 그래서뿐만 아니라 의사 결정 NOSQL입니다

  5. ==============================

    5."제대로 저장하지 않습니다"의미 할 수있다 :

    "제대로 저장하지 않습니다"의미 할 수있다 :

  6. ==============================

    6.MongoDB를 4.0로, 다중 문서 ACID 트랜잭션을 지원한다. 스냅 숏 격리를 통해 트랜잭션 데이터의 전 세계적으로 일관된 뷰를 제공하고, 모 아니면도에게 데이터 무결성을 유지하기 위해 실행을 적용하지 않습니다.

    MongoDB를 4.0로, 다중 문서 ACID 트랜잭션을 지원한다. 스냅 숏 격리를 통해 트랜잭션 데이터의 전 세계적으로 일관된 뷰를 제공하고, 모 아니면도에게 데이터 무결성을 유지하기 위해 실행을 적용하지 않습니다.

    그들은 예 : 관계형 세계에서 거래 같은 느낌 :

    with client.start_session() as s:
        s.start_transaction()
        try:
            collection.insert_one(doc1, session=s)
            collection.insert_one(doc2, session=s)
            s.commit_transaction()
        except Exception:
            s.abort_transaction()
    

    https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb 참조

  7. ==============================

    7.MongoDB의 개발자들이 최근 모음 넓은 쓰기 잠금 데이터베이스 잠금을 교환하기 때문에 원자 수정은 단일 수집에 반대하는 유일한 이유입니다. 증가 된 동시성 여기에 트레이드 오프 가치가 있다는 결정. 그것의 핵심은, MongoDB를는 메모리 매핑 파일입니다 : 그들은 기계의 VM 서브 시스템에 버퍼 풀 관리를 위임했습니다. 이 메모리에 항상 있기 때문에 매우 물론 그레인 잠금 멀리 얻을 수있어 : 매우 빠른 될 것이다, 그것을 유지하는 동안 메모리에만 작업을 수행 할 수 있습니다. 가끔은를 수행하기 위해 강제로 기존의 데이터베이스 시스템에서 크게이 다릅니다은 / O는 pagelock 또는 노 걸이를 잡고있다.

    MongoDB의 개발자들이 최근 모음 넓은 쓰기 잠금 데이터베이스 잠금을 교환하기 때문에 원자 수정은 단일 수집에 반대하는 유일한 이유입니다. 증가 된 동시성 여기에 트레이드 오프 가치가 있다는 결정. 그것의 핵심은, MongoDB를는 메모리 매핑 파일입니다 : 그들은 기계의 VM 서브 시스템에 버퍼 풀 관리를 위임했습니다. 이 메모리에 항상 있기 때문에 매우 물론 그레인 잠금 멀리 얻을 수있어 : 매우 빠른 될 것이다, 그것을 유지하는 동안 메모리에만 작업을 수행 할 수 있습니다. 가끔은를 수행하기 위해 강제로 기존의 데이터베이스 시스템에서 크게이 다릅니다은 / O는 pagelock 또는 노 걸이를 잡고있다.

  8. ==============================

    8.더 나은 이해를 얻기 위해 ACID 속성에 대해 읽어 보시기 바랍니다.

    더 나은 이해를 얻기 위해 ACID 속성에 대해 읽어 보시기 바랍니다.

    또한 MongoDB를 문서에 당신은 질문과 답을 찾을 수 있습니다.

    나는 몇 가지 조사가 ACID 제약 또는 유사한으로되는 NoSQL을 이동하는 진행되고있다 생각합니다. 되는 NoSQL 데이터베이스는 일반적으로 빠른 (어)이며, ACID 제약 성능이 크게 저하 할 수 있기 때문 도전이다.

  9. ==============================

    9."MongoDB를에서, 하나의 문서에 대한 조작은 원자입니다"- 즉, 과거의 일이

    "MongoDB를에서, 하나의 문서에 대한 조작은 원자입니다"- 즉, 과거의 일이

    MongoDB를 4.0 당신이 할 수있는 새 버전에서 :

    어떻게 그리고 어떤 작업을위한 몇 가지 제한이 있지만 수행 할 수 있습니다.

    몽고 문서를 확인하십시오. https://docs.mongodb.com/master/core/transactions/

  10. ==============================

    10.당신은 (MongoDB를 마찬가지이다) 키를 원 자성 당 스토리지 지원이와 비교하면 클라이언트 측에서 원자 멀티 키 업데이트 (직렬화 거래)를 구현하고 설정할 수 있습니다. 이러한 접근 방식은 구글의 여과기에서와 CockroachDB에 사용되지만 아무것도 MongoDB를 함께 사용하지 못하도록합니다.

    당신은 (MongoDB를 마찬가지이다) 키를 원 자성 당 스토리지 지원이와 비교하면 클라이언트 측에서 원자 멀티 키 업데이트 (직렬화 거래)를 구현하고 설정할 수 있습니다. 이러한 접근 방식은 구글의 여과기에서와 CockroachDB에 사용되지만 아무것도 MongoDB를 함께 사용하지 못하도록합니다.

    나는 이러한 거래의 단계별로 시각화를 만들었습니다. 나는 그들을 이해하는 데 도움이되기를 바랍니다.

    당신이 경우 커밋 된 읽기 격리 수준에서 나왔습니다 벌금 다음은 피터 Bailis에 의해 RAMP 거래에 살펴 봐야 의미가 있습니다. 또한 클라이언트 측에서 MongoDB를 구현 할 수 있습니다.

  11. from https://stackoverflow.com/questions/7149890/what-did-mongodb-not-being-acid-compliant-before-v4-really-mean by cc-by-sa and MIT license