SQL--事務

SQL--事務

博客說明程序員

文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!

概念

若是一個包含多個步驟的業務操做,被事務管理,那麼這些操做要麼同時成功,要麼同時失敗sql

操做

1. 開啓事務: start transaction;
2. 回滾:rollback;
3. 提交:commit;

案例

CREATE TABLE account (
            id INT PRIMARY KEY AUTO_INCREMENT,
            NAME VARCHAR(10),
            balance DOUBLE
        );
        -- 添加數據
        INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
        SELECT * FROM account;
        UPDATE account SET balance = 1000;
        -- 張三給李四轉帳 500 元
        
        -- 0. 開啓事務
        START TRANSACTION;
        -- 1. 張三帳戶 -500
        
        UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
        -- 2. 李四帳戶 +500
        -- 出錯了...
        UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
        
        -- 發現執行沒有問題,提交事務
        COMMIT;
        
        -- 發現出問題了,回滾事務
        ROLLBACK;

事務的四大特徵

  1. 原子性:是不可分割的最小操做單位,要麼同時成功,要麼同時失敗。
  2. 持久性:當事務提交或回滾後,數據庫會持久化的保存數據。
  3. 隔離性:多個事務之間。相互獨立。
  4. 一致性:事務操做先後,數據總量不變

事務的隔離級別(瞭解)

  • 概念:多個事務之間隔離的,相互獨立的。可是若是多個事務操做同一批數據,則會引起一些問題,設置不一樣的隔離級別就能夠解決這些問題。
  • 存在問題:數據庫

    1. 髒讀:一個事務,讀取到另外一個事務中沒有提交的數據
    2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不同。
    3. 幻讀:一個事務操做(DML)數據表中全部記錄,另外一個事務添加了一條數據,則第一個事務查詢不到本身的修改。
  • 隔離級別:安全

    1. read uncommitted:讀未提交學習

      • 產生的問題:髒讀、不可重複讀、幻讀
    2. read committed:讀已提交 (Oracle)code

      • 產生的問題:不可重複讀、幻讀
    3. repeatable read:可重複讀 (MySQL默認)事務

      • 產生的問題:幻讀
    4. serializable:串行化字符串

      • 能夠解決全部的問題
    • 注意:隔離級別從小到大安全性愈來愈高,可是效率愈來愈低
    • 數據庫查詢隔離級別:博客

      • select @@tx_isolation;
    • 數據庫設置隔離級別:it

      • set global transaction isolation level 級別字符串;

感謝

黑馬程序員

以及勤勞的本身

相關文章
相關標籤/搜索