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