mySQL默認存儲引擎為InnoDB,可以通過使用命令SHOW VARIABLES LIKE 'storage_engine';
一、InnoDB存儲引擎
1.InnoDB是事務型數(shù)據(jù)庫的首選引擎,支持事務安全表(ACID)
(MyISAM:不支持事務;只支持表級鎖)
事務的ACID屬性:即原子性、一致性、隔離性、持久性
a.原子性:原子性也就是說這組語句要么全部執(zhí)行,要么全部不執(zhí)行,如果事務執(zhí)行到一半出現(xiàn)錯誤,數(shù)據(jù)庫就要回滾到事務開始執(zhí)行的地方。
實現(xiàn):主要是基于MySQ日志系統(tǒng)的redo和undo機制。事務是一組SQL語句,里面有選擇,查詢、刪除等功能。每條語句執(zhí)行會有一個節(jié)點。例如,刪除語句執(zhí)行后,在事務中有個記錄保存下來,這個記錄中儲存了我們什么時候做了什么事。如果出錯了,就會回滾到原來的位置,redo里面已經存儲了我做過什么事了,然后逆向執(zhí)行一遍就可以了。
b.一致性:事務開始前和結束后,數(shù)據(jù)庫的完整性約束沒有被破壞。(eg:比如A向B轉賬,不可能A扣了錢,B卻沒有收到)
c.隔離性:同一時間,只允許一個事務請求同一數(shù)據(jù),不同的事務之間彼此沒有任何干擾;
如果不考慮隔離性則會出現(xiàn)幾個問題。
i、臟讀:是指在一個事務處理過程里讀取了另一個未提交的事務中的數(shù)據(jù)(當一個事務正在多次修改某個數(shù)據(jù),而在這個事務中這多次的修改都還未提交,這時一個并發(fā)的事務來訪問該數(shù)據(jù),就會造成兩個事務得到的數(shù)據(jù)不一致);(讀取了另一個事務未提交的臟數(shù)據(jù))
ii、不可重復讀:在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務范圍內多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務修改并提交了;(讀取了前一個事務提交的數(shù)據(jù),查詢的都是同一個數(shù)據(jù)項。
iii、幻讀:是事務非獨立執(zhí)行時發(fā)生的一種現(xiàn)象(eg:事務T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣);(讀取了前一個事務提交的數(shù)據(jù),針對一批數(shù)據(jù)整體)
d.持久性:事務完成后,事務對數(shù)據(jù)庫的所有更新將被保存到數(shù)據(jù)庫,不能回滾
2.InnoDB是mySQL默認的存儲引擎,默認的隔離級別是RR,并且在RR的隔離級別下更近一步,通過多版本并發(fā)控制(MVCC)解決不可重復讀問題,加上間隙鎖(也就是并發(fā)控制)解決幻讀問題。因此InnoDB的RR隔離級別其實實現(xiàn)了串行化級別的效果,而保留了比較好的并發(fā)性能。