db.collection.stats()
返回
wiredTiger: {
.....
"transaction" : {
"update conflicts" : NumberInt(1410)
},
....
}
它是 MongoDB 3.6,但我不使用它与客户端会话和可重试写入相关的新功能。
找不到很多关于数字含义的文档,除了
并发操作之间的冲突。
由于与并发操作冲突而无法完成操作时会生成此错误。该操作可以重试;如果事务正在进行,则应回滚并在新事务中重试该操作。
在http://source.wiredtiger.com/3.0.0/group__wt.html#ga5ee3c6fcd074e11efd118f3e68e91db8
这是否意味着自创建集合以来有 1410 次失败更新,或者其中一些已成功“重试”隐式?
该数字记录了两个或多个线程尝试更新 WiredTiger 存储引擎内的同一文档的次数。它不会在服务器重新启动之间持续存在。
此统计信息特定于 WiredTiger 存储引擎(因为它位于 WiredTiger 部分下)。在 MongoDB 下,这称为写冲突,并且将在有效条件下透明地重试。
也就是说,MongoDB 会重试更新(使用 WiredTiger 的 API),直到它在没有冲突的情况下完成。从客户端的角度来看,写入成功并且除了延迟增加之外是正常的。
写冲突表明多个客户端试图在相同的几分之一秒内更新完全相同的文档。此窗口是执行 WiredTiger API
WT_SESSION::begin_transaction()
和WT_SESSION::commit_transaction()
操作之间的时间。这些操作没有固定的最短时间。如果要写入的数据量很小并且服务器没有 CPU 或内存通道的队列,则它可能是两位数甚至一位数微秒。也没有固定的最大时间,尽管它在某种程度上取决于服务器的性能。这些冲突可能是由于 WiredTiger 的乐观并发控制引起的,WiredTiger 的并发常见问题解答中对此进行了描述。
请注意,从 MongoDB 的角度来看,WiredTiger 源代码中的注释可能会产生误导,因为 WiredTiger 和 MongoDB 使用的术语大多相同,但它们的含义略有不同。
例如,WiredTiger 中的“事务”一直可用,但 MongoDB 中的“事务”是指 MongoDB 4.0 的多文档 ACID 事务功能(在撰写本文时尚未发布)。