【发布时间】:2015-07-25 01:28:39
【问题描述】:
假设我有一个集合,我在其中创建一个字段的唯一索引:
db.users.createIndex({username: 1}, {unique:true})
如果将两个具有相同用户名的文档同时插入到集合中会怎样?
数据库如何防止冲突?我的意思是哪个被插入,哪个导致错误?
假设插入确实是同时进行的,那么数据库无法知道正在插入两个重复项,对吗?
那么,到底发生了什么?
【问题讨论】:
-
简单来说,哪个insert先拿到写锁就赢,另一个insert会出错。
-
@JohnnyHK,你是说不可能同时获得写锁吗?
-
这就是为什么唯一索引还不能存在于分片 envos atm 中的分片键之外的原因
-
数据首先应用到内存中,因此获得锁是纳秒级的问题。并且 1M 写入很可能在单个服务器上是不可行的。在共享环境中,新文档将被发送到具有匹配键范围的分片。如果做得好,您的写入将或多或少均匀分布(模糊)。假设您有 10 个分片,这将转换为 100k 写入/分片/秒。即使每次取锁和解除锁都需要 10ns,也就是 2M 纳秒或 1/500 秒。还有很多时间去做其他事情。
-
@SylvainLeroux 我已将答案添加为社区 wiki。
标签: mongodb indexing duplicates unique-constraint