MySQL事務

Amos01發表於2023-04-23

一,概念

1.一組原子性的SQL查詢,或者說一個獨立工作單元
2.撤銷日誌和重做日誌是事務的保證
3.事務日誌檔案,主要是用來實現崩潰後恢復的
4.資料庫總是從一個一致性狀態轉換成另一個一致性狀態
5.隔離性,一個事務所做的操作,在提交之前是不看見的 隔離級別和併發成反比
6.永續性,一旦事務提交,其所做的修改會永久儲存於資料庫中

二,事務流程

6006801-a4529d83932321c0.png
image.png

修改自動提交的特性 autocommit 在會話級別

三,操作

    啟動事務:START TRANSACTION
        ...
        ...
    結束事務:
        (1) COMMIT:提交
        (2) ROLLBACK: 回滾

    注意:只有事務型儲存引擎方能支援此類操作;

    建議:顯式請求和提交事務,而不要使用“自動提交”功能;
        autocommit={1|0}

    事務支援savepoint
        SAVEPOINT identifier
        ROLLBACK [WORK] TO [SAVEPOINT] identifier
        RELEASE SAVEPOINT identifier

    事務隔離級別:
        READ UNCOMMITTED (讀未提交)
        READ COMMITTED (讀提交)
        REPEATABLE READ (可重讀)
        SERIALIZABILE (可序列化)

        可能存在問題:
            髒讀;
            不可重複讀;
            幻讀;
            加鎖讀;

        tx_isolation:伺服器變數,預設為REPEATABLE-READ;可在SESSION級進行修改;

        SET tx_isolation=''
            READ-UNCOMMITTED
            READ-COMMITTED
            REPEATABLE-READ
            SERIALIZABLE

        MVCC: 多版本併發控制


    死鎖:
        兩個或多個事務在同一資源相互佔用,並請求鎖定對方佔用的資源的狀態;

    事務日誌:
        事務日誌的寫入型別為“追加”,因此其操作為“順序IO”;此日誌通常也被稱為“預寫式日誌(write ahead logging)”;

            innodb_log_file_size
            innodb_log_files_in_group
            innodb_log_group_home_dir