事務

事務mysql

  • 目的
    • 保證數據庫安全穩定運行的技術
  • 四大特性  ACID 原子性 一致性 隔離性 持久性
    • 原子性
      • 要麼都成功,要麼都失敗
      • 實現機制是undo log
    • 一致性
      • 操做先後,系統穩定,數據移植
      • 原子性不表明一致性
        • 髒讀/不可重複讀/幻讀
          • 解決辦法 調整事務隔離級別
        • 提交事務後,只有一半操做持久化成功
          • 解決辦法redo log
    • 隔離性
      • 每一個事物都是獨立的,相互不會影響
      • 實現機制 多版本併發控制+鎖
    • 持久性
      • 保證食物的執行結果必定能在數據庫中同步完成,不管數據庫所在硬件是否癱瘓
      • 實現機制redo log
    • 原子性 持久性 隔離性 實現了一致性
  • MVCC多版本併發控制
    • 簡單來講就是對數據作了多版本處理
    • 事務隔離級別中的RC和RR就是MVCC實現的
    • RR可重複讀級別
      • 快照讀 select * from xx; #在事務中不管讀多少次都和第一次讀的結果同樣
      • 當前讀 select * from xx lock in share mode; select * from xx for update insert update delete
    • RC讀已提交級別
      • 仍然有快照讀,事務提交成功的數據能夠讀取獲得,單讀不到未提交的數據
  • 事務隔離級別
    • 四個級別,只會用到讀已提交和可重複讀這兩個
    • mysql默認爲可重複讀
    • 更新建議使用RC
      • 不會加間隙鎖(影響併發)
      • 索引沒觸發,不會鎖表,只是鎖行
      • 不可重複和幻讀問題,通常不須要管,若是有強一致性要求,加悲觀鎖/樂觀鎖
  • UNDO
    • 做用
      • 用於回滾,實現事務的原子性
      • 實現多版本併發控制(MVCC)
    • 原理
      • 在數據操做執行以前,先將牽扯到的數據備份到undo log,而後再進行數據的操做
  • Undo Log參與事務的簡化過程
1 假設有A、B兩個數據,值分別爲1,2
2 A.事務開始
3 B.記錄A=1到undo log
4 C.修改A=3 (寫入緩衝區)
5 D.記錄B=2到undo log
6 E.修改B=4
7 F.事務提交
    • 若是出現回滾操做,系統能夠利用Undo Log中的備份將數據恢復到事務開始以前的狀態
    • Undo log必須鹹魚數據持久化到磁盤,若是在D,E以前系統崩潰,undo log是完整的,能夠用來回滾事務
  • REDO
    • Redo Log記錄的是新數據的備份
    • 做用
      • 保證事務持久性
    • 原理
      • 新數據寫入內存緩衝區後,將執行的更新操做寫入redo log,再講數據寫入磁盤(必定發生在redo寫入以後,單未必當即執行)
      • 當系統崩潰時,雖然數據沒有寫入磁盤,可是Redo Log已經持久化,系統能夠根據Redo Log的內容,將全部數據恢復到最新的狀態
      • 雖然redo log 和寫入數據庫都是寫入磁盤,可是redo log的性能高於寫入數據庫
    • Undo + Redo事務的簡化過程
1 假設有A、B兩個數據,值分別爲1,2
2 A.事務開始
3 B.記錄A=1到undo log
4 C.修改A=3  (寫入緩衝區) 
5 D.記錄A=3到redo log  (以後的某個時間點寫入磁盤)
6 E.記錄B=2到undo log
7 F.修改B=4
8 G.記錄B=4到redo log
9 J.事務提交
    •  數據庫恢復
      • mysql重啓後自動進行
      • 先REDO,再UNDO
      • 進行回覆時,
        • REDO不區分事務,會重作全部操做(包括未提交的操做和最終回滾的操做)
        • 而後再由UNDO來回滾未提交和要執行回滾的事務
相關文章
相關標籤/搜索