MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Атомарност, изолация и паралелност в MongoDB

Най-популярните релационни бази данни днес поддържат  “ACID ” свойства – атомност, консистенция, изолация и издръжливост. Разработчиците и администраторите на бази данни (администратори на бази данни), работещи с релационни бази данни, имат добро разбиране за поведението на ACID. Въпреки това, когато работите с NoSQL бази данни като MongoDB cloud, има някои ключови разлики, които е важно да разберете. MongoDB предлага голяма гъвкавост при съхранение, схема и мащабиране, но отпуска някои от свойствата на ACID. Важно е да разберете разликите, докато моделирате данните си и изпълнявате команди на MongoDB.

Атомност

Уикипедия дефинира „атомарност“  по следния начин – „В атомарна транзакция , поредица от операции с база данни или всички възникват или нищо възниква. Гаранцията за атомарност предотвратява извършването на актуализации на базата данни само частично, което може да причини по-големи проблеми, след което напълно да отхвърли цялата серия. С други думи, атомарност означава неделимост и несводимост“.

Операциите за запис в MongoDB са атомарни, само на нивото на един документ. Ако променяте множество поддокумента вътре в документ, операцията все още е атомарна, но ако променяте няколко документа, операцията не е атомарна. И така, как постигате атомарно поведение в множество документи? Трябва да използвате модел на „двуфазен комит“, за да постигнете желаната атомарност. Ето страхотен пример от документацията на MongoDB за това как да приложите този модел. Двуфазният модел на записване е нетривиален за прилагане и правилното изпълнение – така че се уверете, че атомарността при запис на множество документи е нещо, за което искате да се стремите.

Изолация

Уикипедия дефинира „изолация“ по следния начин – „В системи бази данни изолация е свойство, което определя как/кога промените, направени от една операция, стават видими за други едновременни операции“. Има няколко начина за постигане на изолация с вашите MongoDB операции, например:

  1. Команда „findAndModifyOperation()“

    Това е един от най-простите начини за запитване и промяна на съществуващи документи. Командата може да върне или предишните стойности на документите, или новите актуализирани стойности на документите. Можете също така да сортирате съвпадащите документи, да ги поставите и да изберете кои полета трябва да бъдат върнати:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Модел „Актуализиране, ако е текущ“

    Този модел е посочен в документацията MongoDB. Това включва повече ръчна работа, но ви дава повече контрол.

  3. Оператор $isolation

    Операторът $isolation предоставя начин за изолиране на записи в множество документи. Операторът $isolation обаче не предоставя гаранция за всичко или нищо – ще трябва да използвате някои от техниките за атомарност, посочени в първия раздел, за да постигнете това. Също така, операторът $isolation не работи за фрагменти. Тази команда се е наричала „$atomic“ – сега е правилно преименувана на „$isolated“.

Успоредност

MongoDB използва ключалки, за да попречи на множество клиенти да актуализират една и съща част от данни по едно и също време. MongoDB 2.2+ използва заключване на ниво „база данни“. Така че, когато една операция на запис заключи базата данни, всички други операции по запис в същата база данни (дори ако са към отделна колекция) се блокират, докато чакат заключване. MongoDB използва  „алчни за писане“ заключвания, които предпочитат записването пред четенето. В 2.2+ някои продължителни операции могат да доведат до заключване.

Безопасност на нишките

Не всички клиентски класове на MongoDB са безопасни за нишки – моля, вижте документацията на вашия конкретен драйвер, за да проверите дали класовете, които използвате, са безопасни за нишки. Например в драйвера на Java класът MongoClient е безопасен за нишки. Така че можете да използвате един екземпляр на този клас във всичките си нишки. Вътрешно MongoClient използва пул за връзки за управление на връзки към сървъра на MongoDB.

Както винаги, ако имате въпроси, моля, свържете се с нас на [email protected].


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да игнорирате нулеви стойности, докато демарширате документ на MongoDB?

  2. MongoDB/Mongoose заявка на определена дата?

  3. MongoDB $ log10

  4. Предотвратете дублиране на влизане с FOSUserBundle

  5. Свързване с MongoDB през SSL с Node.js