我们正在从不再使用的mgov2切换到官方驱动程序
在mgo中,我们将会话模式设置为单调,如下所示:
myMongoSession.SetMode(mgo.Monotonic, true)
我对此的理解是确保:“如果某个进程读取数据项x的值,则该进程对x进行的任何后续读取操作将始终返回相同的值或更新的值。”
这对我们很重要
我将如何使用官方驱动程序执行此操作?我找不到这样做的参考
答案 0 :(得分:3)
我对此的理解是确保:“如果某个进程读取数据项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
根据SetMode()
的{{3}}:
在单调一致性模式下,读取的内容可能并不完全 最新信息,但他们将始终看到变化的历史 向前,在顺序查询中,数据读取将保持一致 同一会话,在该会话中进行的修改将是 在以下查询(您的写入)中观察到。
在实践中,单调模式是通过执行初始 读取与任意辅助节点的唯一连接,如果是 可用,并且一旦首次写入发生,会话连接即为 切换到主服务器。这设法分发一些 次要的阅读负荷,同时保持一些有用的 保证。
在大多数情况下,这是正确的,但是在某些情况下,SecondaryPreferred
可能会选择{em> 次不同的次级,而它们的godoc.org/github.com/globalsign/mgo次可能不同。
我将如何使用官方驱动程序执行此操作?
单调模式是mgo特有的术语,对于Oplog不存在。 MongoDB Go driver和/或causal consistency等新功能已取代了此功能。
mongo-go-driver
较为冗长,但也可以更好地控制multi-document transactions,read preferences和read concern
因果一致性示例:
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)
}
有关交易示例,请参见write concern(在标签上选择Go
语言)