dragonborn Asked: 2023-12-21 23:01:04 +0800 CST2023-12-21 23:01:04 +0800 CST 2023-12-21 23:01:04 +0800 CST 当读取或写入文档时,MongoDB 在文档级别应用什么类型的锁? 772 我已经阅读 MongoDB 文档几个小时了,但找不到清晰直接的答案。在 MongoDB 中读取或写入文档时,它在文档级别应用什么类型的锁(S、X、IS、IX)? 文档 在我观看的视频中,它解释了在读取过程中对文档应用S锁,在写入过程中应用X锁。这也适用于 MongoDB 吗? 我看过的视频 我阅读了各种文档,但找不到我要查找的信息。 mongodb 1 个回答 Voted Best Answer Joe 2023-12-22T06:50:22+08:002023-12-22T06:50:22+08:00 直接的答案是否定的。 当 MongoDB 写入文档时,它将获取数据库和集合上的 IX 锁。如果两者都成功,则会将写入操作发送到底层的wiredTiger存储引擎。 来自关于文档并发的 WiredTiger 文档 WiredTiger 对写操作使用文档级并发控制。因此,多个客户端可以同时修改集合中的不同文档。 对于大多数读写操作,WiredTiger 使用乐观并发控制。WiredTiger 仅在全局、数据库和集合级别使用意向锁。当存储引擎检测到两个操作之间存在冲突时,其中一个操作将引发写入冲突,导致 MongoDB 透明地重试该操作。 文档更新是原子的,因此读取没有问题 - 每次读取都会在写入之前或应用整个写入之后检索文档,因此不需要读取锁定。 当多个进程同时尝试更新文档时,只有一个进程成功,其他进程会发生 writeConflict,并在不通知客户端的情况下重试。存储层发生的writeConflicts数量由serverStatus命令报告。
直接的答案是否定的。
当 MongoDB 写入文档时,它将获取数据库和集合上的 IX 锁。如果两者都成功,则会将写入操作发送到底层的wiredTiger存储引擎。
来自关于文档并发的 WiredTiger 文档
文档更新是原子的,因此读取没有问题 - 每次读取都会在写入之前或应用整个写入之后检索文档,因此不需要读取锁定。
当多个进程同时尝试更新文档时,只有一个进程成功,其他进程会发生 writeConflict,并在不通知客户端的情况下重试。存储层发生的writeConflicts数量由serverStatus命令报告。