ACID
atomicity [,æt?'mis?ti] 原子性 
consistency [k?n'sist?nsi]  一致性 
isolation ['ais?'lei??n] 隔離性 
durability [,dju?r?'bil?ti] 持久性

InnoDB
QPS Question Per Second
TPS Transaction Per Second=(com_commit+com_rollback)/time

隔離級別

更新丟失

臟讀取

重復讀取

 

幻讀

未授權讀取READ-UNCOMMITTED

N

Y

Y

 

Y

授權讀取READ-COMMITTED

N

N

Y

 

Y

可重復讀取REPEATABLE-READ

N

N

N

 

Y

串行SERIALIZABLE

N

N

N

 

N


數(shù)據(jù)庫并發(fā)操作存在的異常情況:
1.更新丟失(LostUpdate):
A和B事務并發(fā)執(zhí)行,A事務執(zhí)行更新后,提交;B事務在A事務更新后,B事務結束前也做了對該行數(shù)據(jù)的更新操作,然后回滾,則兩次更新操作都丟失了。

第一類丟失更新(回滾丟失,Lost update)。
在事務A期間,事務B對數(shù)據(jù)進行了更新;在事務A撤銷之后,覆蓋了事務B已經(jīng)提交的數(shù)據(jù)。
SQL92沒有定義這種現(xiàn)象,標準定義的所有隔離界別都不允許第一類丟失更新發(fā)生。

第二類丟失更新(覆蓋丟失/兩次更新問題,Second lost update)。
在事務A期間,事務B對數(shù)據(jù)進行了更新;在事務A提交之后,覆蓋了事務B已經(jīng)提交的數(shù)據(jù)。
第二類丟失更新,實際上和不可重復讀是同一種問題。

2.臟讀取(DirtyReads):
A和B事務并發(fā)執(zhí)行,B事務執(zhí)行更新后,A事務查詢B事務沒有提交的數(shù)據(jù),B事務回滾,則A事務得到的數(shù)據(jù)不是數(shù)據(jù)庫中的真實數(shù)據(jù)。也就是臟數(shù)據(jù),即和數(shù)據(jù)庫中不一致的數(shù)據(jù)。

3.不可重復讀取(Non-repeatableReads):
 A和B事務并發(fā)執(zhí)行,A事務查詢數(shù)據(jù),然后B事務更新該數(shù)據(jù)并提交,A再次查詢該數(shù)據(jù)時,發(fā)現(xiàn)該數(shù)據(jù)變化了。

4.幻讀(PhantomReads):也稱為幻像(幻影)。
A和B事務并發(fā)執(zhí)行,A事務查詢數(shù)據(jù),B事務插入或者刪除數(shù)據(jù)并提交,A事務再次查詢發(fā)現(xiàn),結果集中,有以前沒有的數(shù)據(jù)或者以前有的數(shù)據(jù)消失了。

為了避免上面出現(xiàn)幾種情況在標準SQL規(guī)范中定義了4個事務隔離級別,不同隔離級別對事務處理不同。

1. READ-UNCOMMITTED未授權讀取/未提交讀
允許臟讀取但不允許更新丟失。
如果一個事務已經(jīng)開始寫數(shù)據(jù),則另外一個事務不允許同時進行寫操作,但允許其他事務讀此行數(shù)據(jù)。通過“排他寫鎖”實現(xiàn)。

2. READ-COMMITTED授權讀取/提交讀
允許不可重復讀取但不允許臟讀取。
更新語句提交以后別的事務才能讀到這個改變。讀取數(shù)據(jù)的事務允許其他事務繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務將會禁止其他事務訪問該行。通過“瞬間共享讀鎖”和“排他寫鎖”實現(xiàn),
在此隔離級下,SELECT命令不會返回尚未提交(Committed)的數(shù)據(jù),也不能返回臟數(shù)據(jù)。

3. REPEATABLE-READ可重復讀取
禁止不可重復讀取和臟讀取。但是有時可能出現(xiàn)幻影數(shù)據(jù)
在同一個事務里面先后執(zhí)行同一個查詢語句的時候,確保得到的結果是一樣的。讀取數(shù)據(jù)的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。通過“共享讀鎖”和“排他寫鎖”實現(xiàn),
在此隔離級下,用SELECT命令讀取的數(shù)據(jù)在整個命令執(zhí)行過程中不會被更改。此選項會影響系統(tǒng)的效能,非必要情況最好不用此隔離級。

4. SERIALIZABLE串行/可串行讀。
事務只能一個接著一個地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級鎖”是無法實現(xiàn)事務序列化的,必須通過其他機制保證新插入的數(shù)據(jù)不會被剛執(zhí)行查詢操作事務訪問到。