一、原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。mysql
二、一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。sql
三、隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。數據庫
四、持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。併發
一、丟失更新spa
兩個不一樣事物同時得到相同數據,而後在各自事務中同時修改了該數據,那麼先提交的事務更新會被後提交事務的更新給覆蓋掉,這種狀況事務A的更新就被覆蓋掉了、丟失了。code
舉個栗子:對象
事務A 事務B 讀取X=100 讀取X=100 寫入x=X+100 寫入x=X+200 事務結束x=200 事務結束x=300 最後x=300
二、髒讀(未提交讀) 事務
事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據ci
三、不可重複讀it
事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。
舉個栗子:
事務A 事務B 讀取X=100 讀取X=100 讀取X=100 寫入x=X+100 事務結束, x=200 讀取X=200 (此時,在同一個事務A中, 讀取的X值發生了變化!) 事務結束
四、幻讀
事務A讀的時候讀出了15條記錄,事務B在事務A執行的過程當中 增長 了1條,事務A再讀的時候就變成了 16 條,這種狀況就叫作幻影讀。
不可重複讀和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住知足條件的行,解決幻讀須要鎖表
是:還存在,不能避免; 否:不存在,能避免
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重複讀(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
排他鎖(X鎖):若事務T對數據對象A加上X鎖,則只容許T讀取和修改A,其餘任何事務都不能在對A加任何類型的鎖,直到T釋放A上的鎖爲止。這就保證了其餘事務在T釋放A上的鎖以前不能再讀取和修改A。
共享鎖(S鎖):若事務T對數據對象A加上S鎖,則只容許T讀A但不能修改A,其餘事務只能再對A加S鎖而不能加X鎖,知道T釋放A上的S鎖爲止。
一級封鎖協議(對應 read uncommited) :
事務T在修改數據R以前必須先對其加X鎖,直到事務結束才釋放。一級封鎖協議能夠防止丟失修改,並保證事務T是可恢復的。
二級封鎖協議(對應read commited):
在一級封鎖協議基礎上增長事務T在讀數據R以前必須先對其加S鎖,讀完後便可釋放S鎖。二級封鎖協議出防止了丟失修改,還能夠進一步防止讀「髒」數據。
三級封鎖協議(對應reapetable read ):
在一級封鎖協議的基礎上增長事務T在讀數據R以前必須先對其加S鎖,直到事務結束才釋放。三級封鎖協議出防止了丟失修改和讀「髒」數據外,還能夠進一步防止了不可重複讀。
串行化:
一二三級封鎖協議都是在行級加鎖,而串行化是對整表加鎖。讀數據時對整表加共享鎖,修改數據對整表加排他鎖。