說明: mysql是現在行業中流行的關係型資料庫,它的核心是儲存引擎。mysql的儲存引擎有很多種我們可以通過命令檢視如下
SHOW ENGINES
不同版本得到的資料不一樣,我們今天說的事務是在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。mysql從5.5之後預設儲存引擎就是Innodb。
資料庫使用事務是保證資料的完整性,資料庫事務需要滿足4個條件(ACID)
A :原子性(Atomicity)、C :一致性(Consistency) I : 隔離性(Isolation)D:永續性(Durability)
mysql預設自動提交事務
名詞解釋
- 原子性
一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 - 一致性
在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。 - 隔離性
資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。 - 永續性
事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。
隔離級別
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(Read uncommitted) | 可能 | 可能 | 可能 |
讀已提交 (Read committed) | 不可能 | 可能 | 可能 |
可重複讀(Repeatable read) | 不可能 | 不可能 | 可能 |
序列化 (Serializable) | 不可能 | 不可能 | 不可能 |
髒讀: 一個事務中讀到另一個事務沒有提交的資料
不可重複讀: A事務中多次讀取相同的資料時,這中間有另一個事務B對這個表操作了(insert)並提交了,A就會讀取到,這導致A這個事務還沒有結束在讀取同一資料時前後的結果卻不相同。
幻讀: A事務對錶中的資料進行了修改(所有資料),B事務也對這個表進行了修改,是插入操作,那A後續操作會發現還沒有被修改的資料。好像是幻覺,資料行變多或者變少
未提交讀(Read Uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料
提交讀(Read Committed):只能讀取到已經提交的資料。Oracle等多數資料庫預設都是該級別 (不重複讀)
可重複讀(Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB預設級別。在SQL標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀
序列讀(Serializable):完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞
總結: 資料庫隔離級別就是解決我們操作過程中出現的這三種現象,mysql 預設隔離級別可重複讀。