天天看點

事務_hehe.employment.over.4.4

4.6 事務_基本介紹

  • 事務: 如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。
    • 如: 轉賬,往往是要多次通路資料庫才能完成的。轉賬是一個使用者扣錢,另一個使用者加錢。如果其中有一條 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 ('張三', 1000), ('李四', 1000);

/*
模拟張三給李四轉 500 元錢,一個轉賬的業務操作最少要執行下面的 2 條語句:
張三賬号-500
李四賬号+500
*/
-- 手動送出:
-- 0. 開啟事務
START TRANSACTION;
-- 1. 張三賬戶 -500			
UPDATE account SET balance = balance - 500 WHERE NAME = '張三';
-- 2. 李四賬戶 +500
UPDATE account SET balance = balance + 500 WHERE NAME = '李四';			
-- 3.發現執行沒有問題,送出事務
COMMIT;
			
-- 發現出問題了,復原事務
ROLLBACK;
           

4.7 事務_自動送出與手動送出

  • 事務送出的兩種方式:
    • 自動送出
      • mysql就是自動送出的;
      • 一條DML(增删改)語句會自動送出一次事務。
    • 手動送出:
      • Oracle 資料庫預設是手動送出事務;
      • 需要先開啟事務,再送出.
  • 修改事務的預設送出方式:
    • 檢視事務的預設送出方式:

      SELECT @@autocommit; -- 1 代表自動送出 0 代表手動送出

    • 修改預設送出方式:

      set @@autocommit = 0;

4.8 事務_事物的四大特征

  • 事務的四大特征:
    • 1.原子性: 是不可分割的最小操作機關,要麼同時成功,要麼同時失敗。
    • 2.持久性: 當事務送出或復原後,資料庫會持久化的儲存資料。
    • 3.隔離性: 多個事務之間。互相獨立。
    • 4.一緻性: 事務操作前後,資料總量不變.

4.9 事務_事務的隔離級别

  • 概念: 多個事務之間隔離的,互相獨立的。但是如果多個事務操作同一批資料,則會引發一些問題,設定不同的隔離級别就可以解決這些問題。
  • 存在問題:
    • 髒讀: 一個事務,讀取到另一個事務中沒有送出的資料。
    • 不可重複讀(虛讀): 在同一個事務中,兩次讀取到的資料不一樣。
    • 幻讀: 一個事務操作(DML)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。
  • 隔離級别:
    • read uncommitted :讀未送出
      • 産生的問題: 髒讀、不可重複讀、幻讀
    • read committed: 讀已送出 (Oracle)
      • 産生的問題: 不可重複讀、幻讀
    • repeatable read: 可重複讀 (MySQL預設)
      • 産生的問題: 幻讀
    • serializable: 串行化
      • 可以解決所有的問題
  • notes:
    • 隔離級别從小到大安全性越來越高,但是效率越來越低
    • 資料庫查詢隔離級别:

      select @@tx_isolation;

    • 資料庫設定隔離級别:

      set global transaction isolation level 級别字元串; -- 需要重新開啟連接配接,才能生效