MongoDB - снимки WiredTiger против блокировки - PullRequest
0 голосов
/ 09 мая 2018

Я не совсем понимаю, как эти две функции связаны друг с другом в программе MongoDB (WiredTiger):

1) Снимки WiredTiger

2) Блокировка данных

Если каждая операция чтения с использованием механизма WiredTiger во время чтения снабжается «моментальным снимком» на уровне базы данных (для создания согласованности (C в ACID), почему тогда нам также нужна блокировка? Давайте использовать пример.

Я выполняю запрос на уровне документа (операция чтения). Итак, я знаю, что у меня есть моментальный снимок уровня базы данных, так что мои данные согласованы ДАЖЕ ЕСЛИ другой пользователь одновременно пишет в тот же самый Документ, обновляя его.

Итак, на каком этапе используется Shared-Lock для этого документа, который блокирует все операции записи (исключительные) в этом документе до тех пор, пока Shared-Lock не будет освобожден? Что может быть неправильным при написании этого документа одновременно, пока я его читаю, если я на самом деле использую моментальный снимок документа, который был предоставлен мне во время чтения? Зачем мне беспокоиться о том, заблокирован ли документ во время периода чтения или нет? У меня уже есть мои (непротиворечивые) данные за тот момент, нет?

Мне явно не хватает ключевой концепции здесь ... Любая помощь?

Спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

Вы правы, что операция чтения получит снимок. При использовании механизма хранения WiredTiger MongoDB блокирует , а не отдельные документы для чтения или записи. Вместо этого WiredTiger использует Multi-Version Concurrency Control, MVCC. При выполнении обновления документа это обновление будет успешным, если документ все еще имеет ту же версию, что и при получении снимка. Если нет, WiredTiger выдаст ошибку (WT_ROLLBACK), указывающую, что в обновлении были конфликты записи. В этом случае обновление будет прервано, а все ожидающие изменения отменены. После этого MongoDB будет прозрачно повторять операцию.

...