Mongodb系列——Mongodb事务
mongodb事务html
1. 事务基础概念
1.1. 什么是事务和ACID
- 事务就是经过一系列操做来完成一件事情,在进行这些操做的过程当中,要么这些操做彻底执行,要么这些操做全不执行,不存在中间状态,事务分为事务执行阶段和事务提交阶段。通常说到事务,就会想到它的特性— ACID,那么什么是 ACID 呢?咱们先用一个现实中的例子来讲明:AB 两同窗帐号都有 1,000 块钱,A 经过银行转帐向 B 转了 100,这个事务分为两个操做,即从 A 同窗帐号扣除 100,向 B 同窗帐号增长 100。
- 原子性(Atomicity)
- 组成事务的系列操做是一个总体,要么全执行,要么不执行。经过上面例子就是从 A 同窗扣除钱和向 B 同窗增长 100 是一块儿发生的,不可能出现扣除了 A 的钱,但没增长 B 的钱的状况。
- 一致性(Consistency):
- 在事务开始以前和事务结束之后,数据库的完整性和状态没有被破坏。这个怎么理解呢?就是 A、B 两人在转帐钱的总和是 2,000,转帐后两人的总和也必须是 2,000。不会由于此次转帐事务破坏这个状态。
- 隔离性(Isolation):
- 多个事务在并发执行时,事务执行的中间状态是其余事务不可访问的。A 转出 100 但事务没有确认提交,这时候银行人员对其帐号查询时,看到的应该仍是 1,000,不是 900。
- 持久性(Durability)
- 事务一旦提交生效,其结果将永久保存,不受任何故障影响。A 转帐一但完成,那么 A 就是 900,B 就是 1,100,这个结果将永远保存在银行的数据库中,直到他们下次交易事务的发生。
1.2. 事务引起的问题
-
读可写node
-
脏读git
- 指当一个事务正在访问数据,而且对数据进行了修改,而这种修改尚未提交到数据库中,这时,另一个事务也访问这个数据,而后使用了这个数据。由于这个数据是尚未提交的数据, 那么另一个事务读到的这个数据是脏数据,依据脏数据所作的操做多是不正确的。
- 幻读
- 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的所有数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,之后就会发生操做第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉同样。
- 不可重复读
- 指在一个事务内,屡次读同一数据。在这个事务尚未结束时,另一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,因为第二个事务的修改,那么第一个事务两次读到的数据多是不同的。这样就发生了在一个事务内两次读到的数据是不同的,所以称为是不可重复读。
- http://www.tuicool.com/articles/uYrMFv
2. mongodb的事务介绍
2.1. mongodb新的引擎
- 虽然WT实现了多操做事务模型,然而MongoDB并无提供事务,这或许和MongoDB自己的架构和产品定位有关系。
- 可是MongoDB利用了WT的短事务的隔离性实现了文档级行锁 ,对MongoDB来讲这是大大的进步。mongodb能够实现事务可是不提供给用户,这和mongodb的定位有关系
- 扩展阅读
2.2. mongodb实现事物
- 在单个文档等级上,MongoDB支持ACID。更准确的说,默认状况下是“ACI”,打开“j”WriteConcern选项后是ACID。
- Mongo有丰富的查询语言,横跨多个文档,所以人们一直在寻找多文档事务来使用他们的SQL代码。
- 多文档操做不支持事务
- 一个常见的办法是利用文档的性质:不须要不少行、不少关系,你能够将全部的东西嵌入到一个大文档中,Denormalization将带你回归事务。
2.3. 事务实现方式
2.3.1. 理论
- mongodb就是不支持事物,那么就不要作涉及事务的操做
- github实现
- 五个解决方案让MongoDB拥有RDBMS的鲁棒性事务:
2.3.2. 实战
3. mongodb的行内锁
4. 其余,mongodb教程
欢迎关注本站公众号,获取更多信息