事務:Transaction
多個sql語句,要麼同時都執行,要麼同時都不執行
事務就是一組原子性的(select)查詢語句,也即將多個查詢當作一個獨立的工作單元
ACID測試:能夠滿足ACID測試就表示其支持事務,或兼容事務
A:Atomicity,原子性,都執行或者都不執行 C:Consistency,一致性,從一個一致性狀態轉到另外一個一致性狀態 I:Isolaction,隔離性。一個事務的所有修改操作在提交前對其他事務是不可見的 D: Durability, 持久性,一旦事務得到提交,其所做的修改會永久有效
MySQL事務的四個隔離級別
安全性越高,併發性越低(接近串行)
隔離級別:
READ UNCOMMITTED(讀未提交),
髒讀(讀別人尚未提交的數據),
不可重複讀(兩次讀同一個數據,得到的結果可能不一樣,別人可能正在修改)
幻讀
(數據安全性最低,併發性最高)
READ COMMITTED(讀提交)
REPEATABLE READ (可重讀) --> mysql 解決了髒讀
SERIALIZABLE(可串行化)強制事務的串行執行避免了幻讀;性能極低
注:MyISAM存儲引擎不支持事務
啓動事務 mysql > start transaction 事務提交 mysql > commit //所有執行都生效
啓動事務 mysql > start transaction 事務回滾 mysql > rollback mysql > SAVEPOINT identifier 控制回滾的位置 mysql > ROLLBACK [WORK] TO [SAVEPOINT] identifier 回滾到指定位置 //放棄剛剛的某些操作
E.G mysql> start transaction; mysql> select * from tests;
mysql> delete from tests where sid=6; mysql> savepoint a; --> 設置保存點名稱 mysql> delete from tests where sid=4; mysql> savepoint b; mysql> delete from tests where sid=9; mysql> savepoint c; mysql> select * from tests;
mysql> rollback to b; mysql> select * from tests;
mysql> rollback to a; mysql> select * from tests
mysql> rollback; --> 全部恢復 mysql> select * from tests;
如何沒有顯式啓動事務,每個語句都會當作一個默認的事務,其執行完成會被自動提交
mysql> show variables like 'autocommit';
mysql > set session autocommit = 0; --> 手動關閉自動提交功能 注意 關閉自動提交,請記得手動提交事務
查看mysql的事務隔離級別
show global variables like '%iso%' select @@global.tx_isolation
mysql> set global tx_isolation='READ-UNCOMMITTED'; //修改級別 READ-UNCOMMITTED
測試MySQL的四個隔離級別及其重現問題(兩個終端中測試)
讀未提交測試
讀提交測試
可重讀測試
串行化測試
建議:對事物要求不特別嚴格的場景下,可以使用讀提交
修改要想永久有效;修改配置文件
MVCC:多版本併發控制
每個事務啓動時,InnoDB會爲每個啓動的事務提供一個當下時刻的快照
爲實現此功能,InnoDB會爲每個表提供兩隱藏的字段,一個用於保存行的創建時間,
一個用於保存行的失效時間
旨在兩個隔離級別下有效:read committed和repeatable read