### InnoDB和ACID原则
众所周知,数据库是用来存储数据的,但是存储数据这个事情,文件系统也能做,那么为什么要有数据库系统呢?
其实熟知计算机历史的人都会有一点印象,最开始的时候,数据的确是保存在文件系统中的,这个习惯甚至保持到了今天,我上学的时候,我们班的考试成绩就是用Excel保存的,而且Excel强大到了一个让人发指的地步,我们可以很轻松地用Excel完成对每门成绩的加和,然后根据总成绩进行排名。
然而Excel毕竟不是数据库,不然Microsoft也不会在Office套件里提供一个叫做Access的数据库软件。
数据库系统区别于文件系统的最大特点就是ACID。
* A atomicity 即原子性
* C consistency 即一致性
* I isolation 即隔离性
* D durability 即持久性
**原子性**
事务是原子的,即一个事务内的所有操作,要么都执行,要么都不执行。一个事务中,所有的操作,一旦有一个失败了,所有的操作都会回滚。
```sql
begin;
update table1 set col1 = 'xxx' where col2 = 2;
delete table2 where col1 = 3;
rollback;
```
上面的代码片段中展现了一个事务,这个事务中有两个SQL,当这个事务的最后,我手动进行了回滚,那么这两个SQL更改和删除的数据都会被回滚,似乎什么事情都没有发生过一样,数据还是原样。
这就是原子性,不会第一个SQL被执行,而第二个SQL被回滚。
**一致性**
设想一种场景,你的朋友给你转了1000块钱,结果你检查自己账户的时候,却没有发现这1000块钱,你赶紧告诉你的朋友,你的朋友却发现他的账户上少了1000块。这种情况下,你的朋友可能对你的人品产生了怀疑,你也可能怀疑你的朋友骗你。这种事情是数据库的一致性致力于解决的。
比较学术化的说法是,一致性指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
这句话并不好理解,但是实际生活中却有很多一致性的例子。例如现在很多系统都设计有缓存,但是缓存很容易出现和实际数据不一致的问题,因此很多电商平台总会在一个不起眼的地方写一句话:“因可能存在系统缓存、页面更新导致价格变动异常等不确定性情况出现,商品售价以本结算页商品价格为准;如有疑问,请您立即联系销售商咨询。”