MySQL事務

  1. 事務的基本介紹
    1. 概念:
    * 如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。

     2. 操作:
     	1. 開啟事務: start transaction;
     	2. 回滾:rollback;
     	3. 提交:commit;
     3. 例子:
     	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;
     4. MySQL資料庫中事務默認自動提交
     	
     	* 事務提交的兩種方式:
     		* 自動提交:
     			* mysql就是自動提交的
     			* 一條DML(增刪改)語句會自動提交一次事務。
     		* 手動提交:
     			* Oracle 資料庫默認是手動提交事務
     			* 需要先開啟事務,再提交
     	* 修改事務的默認提交方式:
     		* 查看事務的默認提交方式:SELECT @@autocommit; -- 1 代表自動提交  0 代表手動提交
     		* 修改默認提交方式: set @@autocommit = 0;
    
    1. 事務的四大特徵:
      1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。
      2. 持久性:當事務提交或回滾後,資料庫會持久化的保存數據。
      3. 隔離性:多個事務之間。相互獨立。
      4. 一致性:事務操作前後,數據總量不變
    2. 事務的隔離級別(了解)
      • 概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題。

      • 存在問題:

        1. 臟讀:一個事務,讀取到另一個事務中沒有提交的數據
        2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣。
        3. 幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改。
      • 隔離級別:

        1. read uncommitted:讀未提交
          • 產生的問題:臟讀、不可重複讀、幻讀
        2. read committed:讀已提交 (Oracle)
          • 產生的問題:不可重複讀、幻讀
        3. repeatable read:可重複讀 (MySQL默認)
          • 產生的問題:幻讀
        4. serializable:串列化
          • 可以解決所有的問題
        • 注意:隔離級別從小到大安全性越來越高,但是效率越來越低
        • 資料庫查詢隔離級別:
          • select @@tx_isolation;
        • 資料庫設置隔離級別:
          • set global transaction isolation level 級別字元串;
      • 演示:
        set global transaction isolation level read uncommitted;
        start transaction;
        -- 轉賬操作
        update account set balance = balance - 500 where id = 1;
        update account set balance = balance + 500 where id = 2;

Tags: