在MySQL中,事務是在存儲引擎層實現的。對于InnoDB而言:
● 原子性代表著可回滾,這一特性主要有undo log實現;
● 隔離性需要在效率上作出平衡,在不同的隔離級別下主要由MVCC和鎖實現;
● 持久性主要由redo log和double write實現,redo log是一種Write Ahead Log(WAL)策略,用于對數據頁進行重做;double write則用于防止臟頁刷盤時部分寫失效導致的數據丟失。
MVCC(Multiversion concurrency control,多版本并發控制協議),是一種提高系統并發的技術,在很多情況下避免了加鎖操作。MVCC通過undo log來構建數據的歷史版本,通過視圖來定義數據版本的可見性。并由此構建數據庫在某一個時間點的全庫快照(一致性視圖),來實現一致性非鎖定讀,保障事務的隔離性和一致性。
事務是用戶定義的一個數據庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位,事務回滾是指將該事務已經完成的對數據庫的更新操作撤銷。
要同時修改數據庫中兩個不同表時,如果它們不是一個事務的話,當第一個表修改完,可能第二個表修改過程中出現了異常而沒能修改,此時就只有第二個表依舊是未修改之前的狀態,而第一個表已經被修改完畢。而當你把它們設定為一個事務的時候,當第一個表修改完,第二表修改出現異常而沒能修改,第一個表和第二個表都要回到未修改的狀態,這就是所謂的事務回滾。
show table status from `forum`; --forum是指定數據庫名
show engines;
Transaction:是否支持事務
XA:是否通過XA協議實現分布式事務(分為本地資源管理器,事務管理器)。
Savepoint:是否用來實現子事務(嵌套事務)。創建了一個Savepoints之后,事務就可以回滾到這個點,不會影響到創建Savepoints之前的操作。
MyISAM(3 個文件)特點:只讀之類的數據分析的項目
1. 支持表級別的鎖(插入和更新會鎖表)。不支持事務
2. 擁有較高的插入(insert)和查詢(select)速度
3. MyISAM 用一個變量保存了整個表的行數,執行select count(*) from table語句時只需要讀出該變量即可,速度很快;
InnoDB(2 個文件)特點:經常更新的表,存在并發讀寫或者有事務處理的業務系統。
1. 支持事務,支持外鍵,因此數據的完整性、一致性更高
2. 支持行級別的鎖和表級別的鎖
3. 支持讀寫并發,寫不阻塞讀(MVCC)
4. 特殊的索引存放方式,可以減少IO,提升查詢效率
MyISAM 和InnoDB 是我們用得最多的兩個存儲引擎,在 MySQL 5.5 版本之前,默認的存儲引擎是MyISAM。5.5版本之后默認的存儲引擎改成了InnoDB,為什么要改呢?最主要的原因還是InnoDB 支持事務,支持外鍵,支持行級別的鎖,對于業務一致性要求高的場景來說更適合。
InnoDB:適用對數據一致性要求比較高,需要事務支持
MyISAM:適用數據查詢多更新少,對查詢性能要求比較高。
Memory:適用一個用于查詢的臨時表。