事務(wù)的隔離性
事務(wù)的隔離性:多個事務(wù)并發(fā)執(zhí)行時不受到彼此干擾的特性部服。也就是說哟忍,不同用戶的多個事務(wù)并發(fā)執(zhí)行,一個用戶的事務(wù)不會被另一個用戶的事務(wù)干擾瑟押,多個并發(fā)事務(wù)間要相互隔離搀捷。
并發(fā)事務(wù)間的干擾
事務(wù)之間的相互干擾有三種:臟讀、不可重復(fù)讀和幻讀多望。
- 臟讀:一個事務(wù)讀到了另一個事務(wù)未提交的數(shù)據(jù)嫩舟。這里的危害主要在于如果另一個事務(wù)回滾了,沒有提交數(shù)據(jù)怀偷,那么第一個事務(wù)就讀到了不存在的數(shù)據(jù)家厌。
- 不可重復(fù)讀:一個事務(wù)內(nèi)的多次查詢的同一行記錄的值不一樣,行記錄被修改(update)了椎工。
- 幻讀:一個事務(wù)內(nèi)的多次查詢的記錄行數(shù)不一樣饭于,行記錄的數(shù)量可能新增(insert)或減少(delete)了。
事務(wù)的隔離級別
四種隔離級別
為了解決事務(wù)并發(fā)帶來的問題维蒙,才有了事務(wù)規(guī)范中的四個事務(wù)隔離級別掰吕,不同隔離級別對上面問題部分或者全部做了避免。
事務(wù)隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交(Read Uncommit) | √ | √ | √ |
讀已提交(Read Committed) | × | √ | √ |
可重復(fù)讀(Repeatable Read) | × | × | √ |
串行化(Serialization) | × | × | × |
實(shí)現(xiàn)
InnoDB使用不同的鎖策略(Locking Strategy)來實(shí)現(xiàn)不同的隔離級別:
- 讀未提交:select不加鎖木西,可能出現(xiàn)臟讀畴栖;
- 讀已提交:普通select快照讀,鎖select /update /delete 會使用記錄鎖八千,可能出現(xiàn)不可重復(fù)讀吗讶;
- 可重復(fù)讀:普通select快照讀,鎖select /update /delete 根據(jù)查詢條件情況恋捆,會選擇記錄鎖照皆,或者間隙鎖/臨鍵鎖,以防止讀取到幻影記錄沸停;
- 串行化:串行化:select隱式轉(zhuǎn)化為select ... in share mode膜毁,會被 update 與 delete 互斥;
適用場景
InnoDB默認(rèn)的隔離級別是RR(可重復(fù)讀),用得最多的隔離級別是RC(讀已提交)