--- 事務(Transaction):把多條DML語句捆綁在一起,要么同時執行成功要么同時執行失敗
事務的執行sql:
commit --提交
rollback --回滾
savepoint --保存點,便於回滾到某一位置,直接回滾是從頭開始
事務的實現邏輯:
1、開啟事務機制
2、執行DML語句
3、提交事務或回滾(事務提交后將會永久修改硬盤文件內的數據 -- 結束 /// 事務回滾后不會修改硬盤文件上的數據 -- 結束)
例:微信轉賬,好友a給好友b轉賬100元
實際就是執行兩條update的語句 1、update t_user set 賬戶余額 = 賬戶余額 - 1000 where user = a; 2、update t_user set 賬戶余額 = 賬戶余額 + 1000 where user = b;
以上兩條DML語句就是一個事務,開啟事務機制,兩條語句開始執行,要么同時成功要么同時失敗。
事務的四大特性:ACID
A:原子性 --事務是最小的工作單元,不可再分
C:一致性 --所有執行的DML語句必須同時失敗或成功
I: 隔離性 --事務和事務之間必須有隔離
D:持久性 --最終數據必須持久化到硬盤文件中,事務才算成功結束
mysql當中事務是自動提交的
演示:
一條insert語句執行后,數據會自動寫入到表中來
關閉自動提交,演示事務實現邏輯的完整過程。
mysql> start transaction; --關閉事務自動提交機制 Query OK, 0 rows affected (0.00 sec) mysql> insert into t_user(username)values('test'); --插入數據 Query OK, 1 row affected (0.00 sec) mysql> select * from t_user; --查看表內數據 +----+----------+ | id | username | +----+----------+ | 1 | ls | | 2 | sz | | 9 | yanshi | | 10 | test | +----+----------+ 4 rows in set (0.00 sec) mysql> rollback; --回滾 Query OK, 0 rows affected (0.00 sec) mysql> select * from t_user; --再次查看表內數據,此時表內id=10的數據已經消失 +----+----------+ | id | username | +----+----------+ | 1 | ls | | 2 | sz | | 9 | yanshi | +----+----------+ 3 rows in set (0.00 sec)
幾條語句下來,就驗證了事務的實現邏輯,如果沒有commit動作,事務結束后,是不會修改到硬盤內的數據
事務的隔離性也分為四大隔離等級
第一級別:讀取未提交數據(read uncommitted)
釋:a關閉自動提交后,處於第一級別的隔離性,在執行DML語句后,未做commit動作,b查看這張表是能查看到未提交前a所執行的DML語句
缺點:存在臟數據,數據及其不穩定
第二級別:讀取已提交數據(read committed)
釋:a關閉自動提交后,處於第二級別的隔離性,在執行DML語句后,做完commit動作,b看到的是commit后的所有表內數據
缺點:不能重復讀表內原始的數據,只能讀commit后變更的數據
第三級別:可重復讀(repeatable read)
釋:commit后的數據不能讀取到,只能讀事務開啟時的數據
第四級別:序列化讀
釋:排隊讀取,當a在讀時,b就得一直等,直到a停止讀取后,b才能讀取
缺點:效率低,所有的事務都得進行排隊
mysql當中默認的隔離級別是第三級別,而oracle中默認的隔離級別是第二級別
mysql> select @@global.tx_isolation; --查看mysql的隔離級別 +-----------------------+ | @@global.tx_isolation | +-----------------------+ | REPEATABLE-READ | +-----------------------+ 1 row in set, 1 warning (0.00 sec)
有啥個人誤解,望評論區指出,謝謝!