MySQL數據庫之--事物機制

事物機制

5.0版本後出現的,解決:

  • 避免寫入直接操作數據文件,直接操作數據文件是很危險的事
  • MySQL有5種日誌文件,其中只有redo日誌和undo日誌與事物有關
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mL1ZQbDz-1579261137144)(./_image/2020-01-15-17-08-59.png)]
  • RDBMS=SQL語句 + 事務(ACID)

原子性

  • 事務是一個或者多個SQL語句組成的整體,要麼全部執行成功,要麼全都執行失敗 ,事務執行之後,不允許停留在中間某個狀態

把10部門中MANGER員工調往20部門,其他崗位員工調往30部門,然後刪除10部門
事務: 開啓事務 UPDATE語句 DELETE語句 提交事務
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SEf5kTCl-1579261137145)(./_image/2020-01-15-17-26-02.png)]

  • 默認情況下,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 ;  -- 回滾不同步

事務的一致性

  • 不管在任何給定的時間\併發事務有多少, 事務必須保證運行結果的一致性,不允許數據歧義
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DjVehDwM-1579261137146)(./_image/2020-01-15-17-51-40.png)]

隔離性

  • 隔離性要求事務不受其他併發事務的影響, 如果同在給定的時間內,該事物是數據庫唯一運行的事務
  • 默認情況下A事務,只能看到日誌中該事物的相關數據
  • 默認情況下A事務,只能看到該事物的相關數據
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zfqtel4i-1579261137147)(./_image/2020-01-15-17-54-22.png)]

持久性

  • 事務一旦提交,結果便是永久性的,即便發生宕機,仍然可以依靠事務日誌完成數據的持久化

事務的四個隔離級別

他們分別是:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OGo7gZ6Z-1579261137148)(./_image/2020-01-16-00-25-36.png)]
關鍵一句話: 沒有一個是萬能的, 要分場景選擇最合適的

買票案例-有未提交事務

  • 購票場景:READ UNCOMMITTED 能讀到別的事務未提交的數據
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-d7M3WCRw-1579261137148)(./_image/2020-01-16-00-28-28.png)]
  • 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纔對. 所以這個能讀執行時候的數據,不受後續提交影響.
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ipl4Xzby-1579261137153)(./_image/2020-01-16-00-57-24.png)]
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;[blue]

序列化執行事務

把一切併發禁用, 讓事務逐一執行, 這會降低數據庫操作併發能力
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oe9FG425-1579261137154)(./_image/2020-01-16-01-04-57.png)]

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

發佈了44 篇原創文章 · 獲贊 5 · 訪問量 1944
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章