MySQL 三 事務

ellen艾琳發表於2020-11-02

三、MySQL 事務
1、 事務:資料庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操作;這些操作作為一個整體一起向系統提交,要麼都執行、要麼都不執行;
    事務是一組不可再分割的操作集合(工作邏輯單元)
2、 在 MySQL 中只有 InnDB 引擎支援事務
3、 開啟事務
    1)mysql中如何開啟事務:
        begin / start transaction -- 手工
        commit / rollback -- 事務提交或回滾
        set session autocommit = on/off; -- 設定事務是否自動開啟
    2)JDBC 程式設計:connection.setAutoCommit(boolean);
    3)Spring 事務AOP程式設計:expression=execution(com.gpedu.dao.*.*(..))
4、 事務的四個特性
    1)原子性(Atomicity)     要麼全部執行,要麼全部不執行
    2)一致性(Consistency)事務的執行使得資料庫從一種正確狀態轉化為另一種正確狀態,不會因為出現系統意外等原因導致狀態的不一致
    3)隔離性(Isolation)     在事務正確提交之前,不允許把該事務對資料的任何改變提供給其他事務
    4)永續性(Durability) 事務提交後,其結果永久儲存在資料庫中
5、 MySQL 中的四種事務隔離級別
    1)read uncommited:未提交讀,讀到未提交資料
    2)read committed:已提交讀,也叫不可重複讀,兩次讀取到的資料不一致
    3)repetable read:可重複讀
    4)serializable:序列化,讀寫資料都會鎖住整張表,資料操作不會出錯,但併發效能極低,開發中很少用到
6、 MySQL 預設使用 repetable read 的事務隔離級別。
    配置檔案在 MySQL.cnf 裡設定的(預設目錄 /etc/my.cnf),在檔案末尾新增:transaction-isolation = REPEATABLE-READ
    可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE
7、 修改事務的隔離級別: set 作用域 transaction isolation level 事務隔離級別 
    MySQL> set global transaction isolation level read committed; // 設定全域性事務隔離級別為 read committed
    MySQL> set session transaction isolation level read committed; // 設定當前會話事務隔離級別為 read committed
8、 InnoDB 預設是自動提交事務的,每一次 SQL 操作(非 select 操作)都會自動提交一個事務,如果要手動開啟事務需要設定 set autocommit=0 禁止自動提交事務,
    相當於開啟手動提交事務。
9、 髒讀:是一個事務在處理過程中讀取了另外一個事務未提交的資料
10、幻讀:同一個事務內多次查詢返回的結果集不一樣(比如增加了或者減少了行記錄)
11、幻讀重點在於新增或者刪除:在同一事務中,同樣的條件,第一次和第二次讀出來的記錄數不一樣。(因為中間有其他事務提交了插入/刪除)。
12、不可重複讀:重點是修改:在同一事務中,同樣的條件,第一次讀的資料和第二次讀的資料不一樣。(因為中間有其他事務提交了修改)。
13、為什麼會出現幻讀?幻讀會帶來什麼問題?
    因為行鎖只能鎖定存在的行,針對新插入的操作沒有限定,所以就有可能產生幻讀。幻讀帶來的問題如下:對行鎖語義的破壞;破壞了資料一致性
14、併發情況下事務隔離性會帶來的問題:1)髒讀(Dirty Reads)    2)更新丟失(Lost Update)    3)不可重複讀(Non-Repeatable Reads)    4)幻讀(Phantom Reads)
15、解決事務併發可能造成的賍讀、不可重複度、幻讀問題:
    1)加鎖:在讀取資料前,對其加鎖,阻止其他事務對資料進行修改
    2)MVCC(Multiversion Concurrency Control,多版本併發控制):不用加任何鎖, 通過一定機制生成一個資料請求時間點的一致性資料快照(Snapshot), 
        並用這個快照來提供一定級別 (語句級或事務級) 的一致性讀取,從使用者的角度來看,好象是資料庫可以提供同一資料的多個版本
16、MVCC工作原理:在每行記錄後面儲存兩個隱藏的列,一列儲存行的建立時間,一列儲存行的過期時間(刪除時間)。儲存的其實是系統版本號(system version number)。
    每開始一個新的事務,系統版本號都會自動新增,事務開始時刻的系統版本號會作為事務的版本號,用來與查詢到的每行記錄的版本號進行比較。
17、REPEATABLE READ(可重讀)隔離級別下 MVCC 如何工作?
    SELECT:第一,InnoDB 只查詢版本早於當前事務版本的資料行,這樣可以確保事務讀取的行要麼是在開始事務之前已經存在要麼是事務自身插入或者修改過的。
            第二,行的刪除版本號要麼未定義,要麼大於當前事務版本號,這樣可以確保事務讀取到的行在事務開始之前未被刪除。
    INSERT:InnoDB 為新插入的每一行儲存當前系統版本號作為行版本號。
    DELETE:InnoDB 為刪除的每一行儲存當前系統版本號作為行刪除標識。
    UPDATE:InnoDB 為插入的一行新紀錄儲存當前系統版本號作為行版本號,同時儲存當前系統版本號到原來的行作為刪除標識儲存這兩個版本號,使大多數操作都不用加鎖。
            它不足之處是每行記錄都需要額外的儲存空間,需要做更多的行檢查工作和一些額外的維護工作。

相關文章