Мое понимание этого заключается в следующем: «Если процесс читает значение элемента данных x, любая последующая операция чтения по x этим процессом всегда будет возвращать то же значение или более новое значение».
Да, но не всегда.Давайте посмотрим на код комментария для монотонного режима session.go # L73 :
// Monotonic mode is specific to mgo, and is same as SecondaryPreferred before first write.
// Same as Primary after first write.
Monotonic Mode = 1
Согласно godoc.org / github.com / globalsign / mgo дляSetMode()
:
В режиме монотонной согласованности показания могут быть не совсем актуальными, но они всегда будут видеть историю изменений в будущем, считанные данные будут согласованными для последовательных запросовв том же сеансе, и изменения, внесенные в течение сеанса, будут наблюдаться в следующих запросах (чтение-запись-запись).
На практике монотонный режим получается путем выполнения начальных операций чтения по уникальному соединению с произвольнымвторичный, если он доступен, и после первой записи сеансовое соединение переключается на первичный сервер.Это позволяет распределить часть нагрузки чтения со вторичными серверами, сохраняя при этом некоторые полезные гарантии.
Для большинства случаев это верно, однако могут быть случаи, когда SecondaryPreferred
может выбрать разные вторичные серверы, которые могут иметь разные оплоги раз.
Как бы я это сделал, используя официальный драйвер?
Монотонный режим - это термин, специфичный для mgo, и не существует для драйвера MongoDB Go .Это было заменено новыми функциями, такими как причинная согласованность и / или многодокументные транзакции .
mongo-go-driver
более подробный, но также для обеспечения большего контроля над предпочтениями чтения , чтением и записью
Пример причинной согласованности:
opts := options.Client().ApplyURI(mongoURI).SetReadPreference(readpref.Secondary()).SetReadConcern(readconcern.Majority()).SetWriteConcern(writeconcern.New(writeconcern.WMajority()))
client, err := mongo.NewClient(opts)
if err != nil {
panic(err)
}
Пример транзакций см. Транзакции в приложениях (выберите Go
язык на вкладке)