我正在使用Mongo 2.6和在Ubuntu Linux上运行的Reactive Mongo驱动程序。
我有一个执行以下操作的过程: 读取记录,增加记录,然后更新记录。 由于各种约束,操作不能更原子化。 记录有点大(100kb-900kb)。
我试图了解这种情况下的锁定行为,因为我看到一些看似奇怪的事情。这包括看似全局锁定的存在以及分片似乎根本不会提高吞吐量的事实。
在多个线程(总共10个线程)上运行此进程时,我会观察到以下内容:
问:使用全局写锁定(" ^")的写操作是否会阻止读取发生?导致这些锁定的原因是什么?
编辑:
以下是我在执行db.currentOp()
时看到的一些操作的一些示例我最关心的是:
{
"opid" : 83740,
"active" : true,
"secs_running" : 0,
"microsecs_running" : NumberLong(971125),
"op" : "update",
"ns" : "my_database.my_collection_1",
"query" : {
"key" : "395b0a88-ccfb-441f-9c98-627b1f772f21",
"index" : "1000"
},
"client" : "xx.xx.xx.xx:123456",
"desc" : "conn49",
"threadId" : "0x7fa1c79a2700",
"connectionId" : 49,
"locks" : {
"^" : "w"
},
"waitingForLock" : false,
"numYields" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(0),
"w" : NumberLong(336)
},
"timeAcquiringMicros" : {
"r" : NumberLong(0),
"w" : NumberLong(3)
}
}
}
但是我看到其他人喜欢以下内容:
{
"opid" : 1340,
"active" : false,
"op" : "update",
"ns" : "",
"query" : {
"key" : "f7e0ce90-0d0e-4094-9a27-b4fc88ca3171"
},
"client" : "xx.xx.xx.xx:123456",
"desc" : "conn41",
"threadId" : "0x7fa1c81aa700",
"connectionId" : 41,
"locks" : {
"^" : "w",
"^my_database" : "W"
},
"waitingForLock" : true,
"numYields" : 0,
"lockStats" : {
"timeLockedMicros" : {
},
"timeAcquiringMicros" : {
}
}
},
{
"opid" : 78506,
"active" : true,
"secs_running" : 0,
"microsecs_running" : NumberLong(3362),
"op" : "query",
"ns" : "my_database.my_collection_2",
"query" : {
"key" : "2b5c59fa-b649-4c73-91ff-582c21a919ed"
},
"client" : "xx.xx.xx.xx:123456",
"desc" : "conn49",
"threadId" : "0x7fa1c79a2700",
"connectionId" : 49,
"locks" : {
"^" : "r",
"^my_database" : "R"
},
"waitingForLock" : false,
"numYields" : 5,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(1889),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(830),
"w" : NumberLong(0)
}
}
}