事物機制
5.0版本後出現的,解決:
- 避免寫入直接操作數據文件,直接操作數據文件是很危險的事
- MySQL有5種日誌文件,其中只有redo日誌和undo日誌與事物有關
- RDBMS=SQL語句 + 事務(ACID)
原子性
- 事務是一個或者多個SQL語句組成的整體,要麼全部執行成功,要麼全都執行失敗 ,事務執行之後,不允許停留在中間某個狀態
把10部門中MANGER員工調往20部門,其他崗位員工調往30部門,然後刪除10部門
事務:開啓事務 UPDATE語句 DELETE語句 提交事務
- 默認情況下,MySQL執行每條SQL語句都會自動開啓和提交事務
- 爲了讓多條SQL語句納入一個事務下,可以手動管理事務
START TRANSACTION;
SQL語句
[COMMIT | ROLLBACK];
- COMMIT:持久化提交
- ROLLBACK:回滾
START TRANSACTION; -- 啓動事務機制
delete from t_emp;
delete from t_dept;
SELECT * FROM t_emp;
SELECT * FROM t_dept;
-- COMMIT; -- 提交同步(給註釋掉了)
ROLLBACK ; -- 回滾不同步
事務的一致性
- 不管在任何給定的時間\併發事務有多少, 事務必須保證運行結果的一致性,不允許數據歧義
隔離性
- 隔離性要求事務不受其他併發事務的影響, 如果同在給定的時間內,該事物是數據庫唯一運行的事務
- 默認情況下A事務,只能看到日誌中該事物的相關數據
- 默認情況下A事務,只能看到該事物的相關數據
持久性
- 事務一旦提交,結果便是永久性的,即便發生宕機,仍然可以依靠事務日誌完成數據的持久化
事務的四個隔離級別
他們分別是:
關鍵一句話: 沒有一個是萬能的, 要分場景選擇最合適的
買票案例-有未提交事務
- 購票場景:
READ UNCOMMITTED
能讀到別的事務未提交的數據
- READ UNCOMMITTED 代表可以讀取其他事務未提交的數據
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;[BLUE]
-- 案例一個
-- 事務A:開啓事務,把所有工資設置爲1,但是沒提交(沒commit) ,此時查出來都是1元;
START TRANSACTION; -- 啓動事務機制
UPDATE t_emp SET sal=1;
SELECT sal FROM t_emp;
-- 此時開啓案例B,也來讀sal
SELECT empno , ename, sal FROM t_emp;
-- 讀出來的還是原來的工資數據.
-- 如果想要B讀取出A設置後的東西,則改成下邊代碼
-- B的結果:讀取A未提交的
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
SELECT empno , ename, sal FROM t_emp;
轉賬支出案例
Scott賬務餘額5000, A開啓,沒操作的時候,B支出100,此時scott餘額4900. 緊接着此時A轉賬1000,此時應該scott餘額5900. 如果B又退回100,此時應該6000元. 如果允許A讀取B的操作未提交的,就沒讀到支出的100.A讀到5900塊,少了100.
- READ COMMITTED 代表只能讀取其他事務提交的數據
-- 還是上邊案例,若A沒有提交commit 則B讀不到的話,則用這句話:注意是committed
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT empno , ename, sal FROM t_emp;
下單後,提交訂單前,商家提價了,按下單價
應對:A下單時候350 ,但沒付款. 然後B商家把商品價格改高了到400. 過一會後A去付款還應該是付款350纔對. 所以這個能讀執行時候的數據,不受後續提交影響.
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;[blue]
序列化執行事務
把一切併發禁用, 讓事務逐一執行, 這會降低數據庫操作併發能力
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;