1. 程式人生 > 實用技巧 >01-事務

01-事務

簡述

Transaction Control Language 事務控制語言

事務:事務由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一 旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的資料將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行。

儲存引擎

  • 概念:在mysql中的資料用各種不同的技術儲存在檔案(或記憶體)中
  • 通過 show engines 命令來檢視 MySQL 支援的儲存引擎
  • 在 MySQL 中用的最多的儲存引擎有:innodb,myisam,memory 等。其中 innodb 支援事務,而 myisam、memory 等不支援事務

ACID 屬性

  1. 原子性(Atomicity)
    原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
  2. 一致性(Consistency)
    事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。
  3. 隔離性(Isolation)
    事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
  4. 永續性(Durability)
    永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,資料將持久化到本地,除非其他事務對其進行修改。

事務的分類

隱式事務

  • 沒有明顯的開啟和結束事務的標誌
  • DB 自動提交功能預設開啟
  • 比如 insert、update、delete 語句本身就是一個事務

顯式事務

  • 具有明顯的開啟和結束事務的標誌
  • 開啟事務 → 編寫事務的一組邏輯操作單元 → 提交事務 | 回滾事務
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    ...
    COMMIT / ROLLBACK;
    

事務通常以 START TRANSACTION 開始(如果 SET AUTOCOMMIT = 0,START TRANSACTION 則可省略)。以 COMMIT 或 ROLLBACK 結束。COMMIT 表示提交,即提交事務的所有操作。具體地說就是將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中,事務正常結束。ROLLBACK 表示回滾,即在事務執行的過程中發生了某種故障,事務不能繼續執行,系統將事務中對資料庫的所有已完成的操作全部撤銷,回滾到事務開始時的狀態。這裡的操作指對資料庫的更新操作。

隔離級別

  • 事務併發問題如何發生? 當多個事務同時操作同一個資料庫的相同資料時
  • 事務的併發問題有哪些?
    • 【髒讀】對於兩個事務 T1、T2,T1 讀取了已經被 T2 更新但還沒有被提交的欄位。之後,若 T2 回滾,T1 讀取的內容就是臨時且無效的
    • 【不可重複讀】對於兩個事務T1、T2,T1 讀取了一個欄位,然後 T2 更新了該欄位。之後, T1再次讀取同一個欄位,值就不同了
    • 【幻讀】 對於兩個事務T1、T2,T1 從一個表中讀取了一個欄位,然後 T2 在該表中插入了一些新的行。之後, 如果 T1 再次讀取同一個表,就會多出幾行
  • 如何避免事務的併發問題?
    • 通過設定事務的隔離級別, 一個事務與其他事務隔離的程度稱為 "隔離級別"。
    • 資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響,避免各種併發問題。資料庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,資料一致性就越好,但併發性越弱。
  • Oracle 支援的 2 種事務隔離級別:READ COMMITED,SERIALIZABLE。Oracle 預設的事務隔離級別為:READ COMMITED
  • MySQL 支援 4 種事務隔離級別。MySQL 預設的事務隔離級別為:REPEATABLE READ
  • 每啟動一個 MySQL 程式, 就會獲得一個單獨的資料庫連線。每個資料庫連線都有一個全域性變數 @@tx_isolation,表示當前的事務隔離級別。
  • 相關命令
    • 檢視當前的隔離級別: SELECT @@tx_isolation;
    • 設定當前 MySQL 連線的隔離級別:set transaction isolation level ???;
    • 設定資料庫系統的全域性的隔離級別:set global transaction isolation level ???;

回滾點

SAVEPOINT 斷點
COMMIT TO 斷點
ROLLBACK TO 斷點

delete & truncate

  • DELETE 語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。
  • TRUNCATE 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。

https://www.cnblogs.com/zhizhao/p/7825469.html