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
隔離級(jí)別
|
更新丟失
|
臟讀取
|
重復(fù)讀取
|
|
幻讀
|
未授權(quán)讀取READ-UNCOMMITTED
|
N
|
Y
|
Y
|
|
Y
|
授權(quán)讀取READ-COMMITTED
|
N
|
N
|
Y
|
|
Y
|
可重復(fù)讀取REPEATABLE-READ
|
N
|
N
|
N
|
|
Y
|
串行SERIALIZABLE
|
N
|
N
|
N
|
|
N
|
數(shù)據(jù)庫(kù)并發(fā)操作存在的異常情況:
1.更新丟失(LostUpdate):
A和B事務(wù)并發(fā)執(zhí)行,A事務(wù)執(zhí)行更新后,提交;B事務(wù)在A事務(wù)更新后,B事務(wù)結(jié)束前也做了對(duì)該行數(shù)據(jù)的更新操作,然后回滾,則兩次更新操作都丟失了。
第一類丟失更新(回滾丟失,Lost update)。
在事務(wù)A期間,事務(wù)B對(duì)數(shù)據(jù)進(jìn)行了更新;在事務(wù)A撤銷之后,覆蓋了事務(wù)B已經(jīng)提交的數(shù)據(jù)。
SQL92沒有定義這種現(xiàn)象,標(biāo)準(zhǔn)定義的所有隔離界別都不允許第一類丟失更新發(fā)生。
第二類丟失更新(覆蓋丟失/兩次更新問題,Second lost update)。
在事務(wù)A期間,事務(wù)B對(duì)數(shù)據(jù)進(jìn)行了更新;在事務(wù)A提交之后,覆蓋了事務(wù)B已經(jīng)提交的數(shù)據(jù)。
第二類丟失更新,實(shí)際上和不可重復(fù)讀是同一種問題。
2.臟讀取(DirtyReads):
A和B事務(wù)并發(fā)執(zhí)行,B事務(wù)執(zhí)行更新后,A事務(wù)查詢B事務(wù)沒有提交的數(shù)據(jù),B事務(wù)回滾,則A事務(wù)得到的數(shù)據(jù)不是數(shù)據(jù)庫(kù)中的真實(shí)數(shù)據(jù)。也就是臟數(shù)據(jù),即和數(shù)據(jù)庫(kù)中不一致的數(shù)據(jù)。
3.不可重復(fù)讀取(Non-repeatableReads):
A和B事務(wù)并發(fā)執(zhí)行,A事務(wù)查詢數(shù)據(jù),然后B事務(wù)更新該數(shù)據(jù)并提交,A再次查詢?cè)摂?shù)據(jù)時(shí),發(fā)現(xiàn)該數(shù)據(jù)變化了。
4.幻讀(PhantomReads):也稱為幻像(幻影)。
A和B事務(wù)并發(fā)執(zhí)行,A事務(wù)查詢數(shù)據(jù),B事務(wù)插入或者刪除數(shù)據(jù)并提交,A事務(wù)再次查詢發(fā)現(xiàn),結(jié)果集中,有以前沒有的數(shù)據(jù)或者以前有的數(shù)據(jù)消失了。
為了避免上面出現(xiàn)幾種情況在標(biāo)準(zhǔn)SQL規(guī)范中定義了4個(gè)事務(wù)隔離級(jí)別,不同隔離級(jí)別對(duì)事務(wù)處理不同。
1. READ-UNCOMMITTED未授權(quán)讀取/未提交讀
允許臟讀取但不允許更新丟失。
如果一個(gè)事務(wù)已經(jīng)開始寫數(shù)據(jù),則另外一個(gè)事務(wù)不允許同時(shí)進(jìn)行寫操作,但允許其他事務(wù)讀此行數(shù)據(jù)。通過“排他寫鎖”實(shí)現(xiàn)。
2. READ-COMMITTED授權(quán)讀取/提交讀
允許不可重復(fù)讀取但不允許臟讀取。
更新語(yǔ)句提交以后別的事務(wù)才能讀到這個(gè)改變。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問該行。通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn),
在此隔離級(jí)下,SELECT命令不會(huì)返回尚未提交(Committed)的數(shù)據(jù),也不能返回臟數(shù)據(jù)。
3. REPEATABLE-READ可重復(fù)讀取
禁止不可重復(fù)讀取和臟讀取。但是有時(shí)可能出現(xiàn)幻影數(shù)據(jù)
在同一個(gè)事務(wù)里面先后執(zhí)行同一個(gè)查詢語(yǔ)句的時(shí)候,確保得到的結(jié)果是一樣的。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其他事務(wù)。通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn),
在此隔離級(jí)下,用SELECT命令讀取的數(shù)據(jù)在整個(gè)命令執(zhí)行過程中不會(huì)被更改。此選項(xiàng)會(huì)影響系統(tǒng)的效能,非必要情況最好不用此隔離級(jí)。
4. SERIALIZABLE串行/可串行讀。
事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級(jí)鎖”是無法實(shí)現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作事務(wù)訪問到。