原子性是指事務中的操做要麼所有成功,要麼失敗回滾。數據庫
一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。併發
隔離性是指兩個事務之間的操做互不影響。關於事務的隔離級別後面將會介紹。事務
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。ci
若是不採起數據庫隔離會出現如下問題:開發
事務A將data的值由4修改爲5,可是並未提交;此時事務B讀取data的值是5.可是事務A並無提交進行了回滾,此時事務B讀取的就是一個髒數據(由於此時數據庫中data的數據是4不是5)。it
不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內屢次查詢卻返回了不一樣的數據值,這是因爲在查詢間隔,被另外一個事務修改並提交了。例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據而且提交事務給數據庫,事務T1再次讀取該數據就獲得了不一樣的結果,發生了不可重複讀。不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另外一個事務未提交的髒數據,而不可重複讀則是讀取了前一事務提交的數據。在某些狀況下,不可重複讀並非問題,好比咱們屢次查詢某個數據固然以最後查詢獲得的結果爲主。但在另外一些狀況下就有可能發生問題,例如對於同一個數據A和B依次查詢就可能不一樣,A和B就可能打起來了。
注:不可重複讀強調的是屢次查詢,一樣的select語句,可是2次讀取的結果不同。io
幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中全部的行的某個數據項作了從「1」修改成「2」的操做,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值仍是爲「1」而且提交給數據庫。而操做事務T1的用戶若是再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺同樣,這就是發生了幻讀。幻讀和不可重複讀都是讀取了另外一條已經提交的事務(這點就髒讀不一樣),所不一樣的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據總體(好比數據的個數)。
注:幻讀的重點在於新增或刪除:一樣條件的select,讀取的記錄不同。table
髒讀 | 不可重複讀 | 幻讀 | |
---|---|---|---|
讀未提交(read-uncommitted) | ✅ | ✅ | ✅ |
讀提交(read-committed) | ❌ | ✅ | ✅ |
可重複讀(repeatable-read) | ❌ | ❌ | ✅ |
串行化(Serializable) | ❌ | ❌ | ❌ |