### 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塊。這種情況下,你的朋友可能對你的人品產生了懷疑,你也可能懷疑你的朋友騙你。這種事情是數據庫的一致性致力于解決的。
比較學術化的說法是,一致性指事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
這句話并不好理解,但是實際生活中卻有很多一致性的例子。例如現在很多系統都設計有緩存,但是緩存很容易出現和實際數據不一致的問題,因此很多電商平臺總會在一個不起眼的地方寫一句話:“因可能存在系統緩存、頁面更新導致價格變動異常等不確定性情況出現,商品售價以本結算頁商品價格為準;如有疑問,請您立即聯系銷售商咨詢。”