事務:Transactionmysql
多個sql語句,要麼同時都執行,要麼同時都不執行sql
事務就是一組原子性的(select)查詢語句,也即將多個查詢看成一個獨立的工做單元安全
ACID測試:可以知足ACID測試就表示其支持事務,或兼容事務bash
A:Atomicity,原子性,都執行或者都不執行 C:Consistency,一致性,從一個一致性狀態轉到另一個一致性狀態 I:Isolaction,隔離性。一個事務的全部修改操做在提交前對其餘事務是不可見的 D: Durability, 持久性,一旦事務獲得提交,其所作的修改會永久有效
MySQL事務的四個隔離級別session
安全性越高,併發性越低(接近串行)併發
隔離級別:ide
READ UNCOMMITTED(讀未提交),性能
髒讀(讀別人還沒有提交的數據),測試
不可重複讀(兩次讀同一個數據,獲得的結果可能不同,別人可能正在修改)spa
幻讀
(數據安全性最低,併發性最高)
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