mongodb事务
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. 事务引发的问题
-
读可写
-
脏读
- 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
- 幻读
- 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
- 不可重复读
- 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
- http://www.tuicool.com/articles/uYrMFv
2. mongodb的事务介绍
2.1. mongodb新的引擎
- 虽然WT实现了多操作事务模型,然而MongoDB并没有提供事务,这或许和MongoDB本身的架构和产品定位有关系。
- 但是MongoDB利用了WT的短事务的隔离性实现了文档级行锁 ,对MongoDB来说这是大大的进步。mongodb可以实现事务但是不提供给用户,这和mongodb的定位有关系
- 扩展阅读
- MongoDB新存储引擎WiredTiger实现(事务篇):http://www.tuicool.com/articles/vUR7z2M
- MongoDB Wiredtiger存储引擎实现原理:https://yq.aliyun.com/articles/2352
2.2. mongodb实现事物
- 在单个文档等级上,MongoDB支持ACID。更准确的说,默认情况下是“ACI”,打开“j”WriteConcern选项后是ACID。
- MongoDB 写安全(Write Concern) :http://blog.csdn.net/leshami/article/details/52913705
- Mongo有丰富的查询语言,横跨多个文档,因此人们一直在寻找多文档事务来使用他们的SQL代码。
- 多文档操作不支持事务
- 一个常见的办法是利用文档的性质:不需要很多行、很多关系,你可以将所有的东西嵌入到一个大文档中,Denormalization将带你回归事务。
2.3. 事务实现方式
2.3.1. 理论
- mongodb就是不支持事物,那么就不要做涉及事务的操作
- github实现
- mongodb transaction node
- mongo-tx:https://github.com/zaaack/mongo-tx
- https://github.com/phuong/nodejs-demo
- 五个解决方案让MongoDB拥有RDBMS的鲁棒性事务:
2.3.2. 实战
- MongoDB两阶段提交实现事务:http://www.tuicool.com/articles/f6ZBjm
- Mongodb事务模拟:http://jdkleo.iteye.com/blog/2009974
3. mongodb的行内锁
- MongoDB 利用了 WT 的短事务的隔离性实现了文档级行锁
- mondogb的锁及原子性:http://blog.csdn.net/niclascage/article/details/47110221
- MongoDBV3&V2版本锁性能对比测试及锁的基本概况:http://www.2cto.com/database/201502/375270.html
- $atomic操作符:http://www.cnblogs.com/Kellana/p/5822468.html