文章目錄
- 何為事務?
- 什么是事務的ACID特性?
- 并發事務帶來了哪些問題?
- 不可重復讀和幻讀有什么區別?
- 并發事務的控制方式有哪些?
- SQL標準定義了哪些事務隔離級別?
- MYSQL的隔離級別是基于鎖實現的嗎?
何為事務?
事務是邏輯上的一組操作,要么都執行,要么都不執行
什么是事務的ACID特性?
- A(原子性):事務是最小的執行單位,不允許分割
- C(一致性):執行數據前后,數據保持一致
- I(隔離性):并發訪問數據庫時,一個用戶的事務不被其他的事務所干擾,各并發事務之間數據庫是獨立的
- D(持久性):一個事務被提交后,它對數據庫的改變是持久的,即使數據庫發生故障也不應該對其有任何影響
注意:A,I,D是手段,C是目的
并發事務帶來了哪些問題?
多個事務并發執行,多個用戶對同一用戶進行操作,可能會出現以下問題
臟讀
一個事務修改了數據,但未提交,此時另一個事務讀取了這個還未提交的事務,但是第一個事務突然回滾,導致數據并未提交到數據庫,這里第二個事務讀取到的就是臟數據
丟失修改
一個事務讀取到一個數據時,另一個事務也訪問了該數據,第一個事務對數據進行修改,另一個事務又修改了這個數據,這樣第一個事務內的修改結果就被丟失
不可重復讀
一個事務內多次讀同一個數據,期間另外一個事務對數據進行修改,使得第一個事務兩次讀到的內容不一致
幻讀
一個事務讀取了數據,接著另外的并發事務插入了一些數據,則前一個事務再次讀取數據時,發現多出了一些記錄,像幻覺一樣!
不可重復讀和幻讀有什么區別?
不可重復讀重點是多次讀取數據發現其中某些記錄的值被修改
幻讀重點是多次讀取數據發現查到的記錄增加了
幻讀可以看成是不可重復讀的一種特殊情況,區分是因為解決兩者的方案不一樣
并發事務的控制方式有哪些?
鎖和MVCC (todo 完善)
SQL標準定義了哪些事務隔離級別?
- READ-UNCOMMITTED(讀取未提交)
- READ-COMMITTED(讀取已提交)
- **REPEATABLE-READ(可重復讀) : **InnoDB存儲引擎支持的默認隔離級別
- SERIALIZABLE(可串行化)
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
MYSQL的隔離級別是基于鎖實現的嗎?
是基于鎖和MVCC機制共同實現的
SERIALIZABLE 是通過鎖來實現的,READ-COMMITTED和REPEATABLE-READ是基于MVCC實現的