所以我做了一些研究,发现MongoDB没有做fsync(),这意味着当你告诉数据库写一些东西时,数据库可能会告诉你它已经写好了,尽管它不是.这不是反对CRUD吗?
如果我是对的,有什么好的理由吗?
原因是表现.无需在每次更改时写入磁盘,MongoDB都可以更快地处理更新.
MongoDB告诉您何时将更新传递到服务器,而不是何时已经写入更新,正如您可以阅读有关使用getLastError验证写入传播的文档中所述:
注意:当数据已传送到[服务器]时,当前实现将返回.未来的版本将提供更多的交付选项,比如服务器上的物理fsync.
这是针对ACID,更具体地针对D,这代表耐久性:
持久性[保证]一旦用户被告知事务成功,事务就不会丢失,事务的数据更改将在系统故障后继续存在,并且所有完整性约束都已得到满足,因此DBMS无需撤消交易.
ACID属性主要适用于传统的RDBMS系统.NoSQL系统(包括MongoDB)放弃了一个或多个ACID属性,以实现更好的可伸缩性.在MongoDB的情况下,在处理大量更新时牺牲了耐久性以获得更好的性能.
大多数ACID属性是事务级别的保证.事务通常是一组应被视为单个单元的查询.由于性能原因,MongoDB没有交易概念.因此,大多数ACID属性不适用于MongoDB.
A - 原子性表明交易应该成功还是失败.不允许部分成功; 如果部分事务失败,则应回滚整个事务.MongoDB支持文档级别的原子操作,但不支持"事务"级别的原子操作.
C - 一致性部分是指原子性,但也包括参照完整性.关系数据库负责确保所有外键引用都有效.MongoDB没有外键的概念,因此这个ACID属性不适用.
I - 隔离表明不允许两个并发事务相互干扰; 如果两个事务尝试修改相同的数据,则第二个事务必须等待第一个事务完成.为此,数据库将锁定数据.MongoDB没有锁定的概念,因此它不支持多个操作的隔离1).单个操作是隔离的.
D-耐久性如上所述.就ACID-ic耐久性而言,MongoDB不支持真正的耐久性.
现在,您可能认为MongoDB与RDBMS系统相比毫无用处,因为它缺少事务和大多数ACID保证.但是,事务存在的部分原因是关系数据库需要将某些数据视为单个实体,但此数据已标准化为多个表.
MongoDB允许您将数据存储为单个实体.在大多数情况下,这消除了对外键和引用完整性的需要.您也不需要多查询事务,因为您不需要多个表来更新单个实体.大多数情况下,您只需更新单个文档,并且这些操作在MongoDB中是原子操作.
1)根据本页的第一条评论,db.eval()
为多个操作提供隔离.但是,根据您通常希望避免使用的文档db.eval()
.