從理論上來說, 事務應該彼此完全隔離, 以避免并發(fā)事務所導致的問題包警,然而, 那樣會對性能產(chǎn)生極大的影響, 因為事務必須按順序運行,?在實際開發(fā)中, 為了提升性能, 事務會以較低的隔離級別運行底靠, 事務的隔離級別可以通過隔離事務屬性指定害晦。
2.1事務的并發(fā)問題
(1)臟讀:事務A讀取了事務B更新的數(shù)據(jù),然后B回滾操作暑中,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
(2)不可重復讀:事務 A 多次讀取同一數(shù)據(jù)壹瘟,事務 B 在事務A多次讀取的過程中,對數(shù)據(jù)作了更新并提交鳄逾,導致事務A多次讀取同一數(shù)據(jù)時稻轨,結果因此本事務先后兩次讀到的數(shù)據(jù)結果會不一致。
(3)幻讀:幻讀解決了不重復讀雕凹,保證了同一個事務里殴俱,查詢的結果都是事務開始時的狀態(tài)(一致性)。
例如:事務T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作 這時事務T2又對這個表中插入了一行數(shù)據(jù)項枚抵,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫线欲。 而操作事務T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有跟沒有修改一樣汽摹,其實這行是從事務T2中添加的李丰,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀逼泣。
小結:不可重復讀的和幻讀很容易混淆趴泌,不可重復讀側重于修改,幻讀側重于新增或刪除拉庶。解決不可重復讀的問題只需鎖住滿足條件的行嗜憔,解決幻讀需要鎖表。
2.2事務的隔離級別
事務隔離級別
讀未提交:另一個事務修改了數(shù)據(jù)砍的,但尚未提交痹筛,而本事務中的SELECT會讀到這些未被提交的數(shù)據(jù)臟讀
不可重復讀:事務 A 多次讀取同一數(shù)據(jù),事務 B 在事務A多次讀取的過程中,對數(shù)據(jù)作了更新并提交绢馍,導致事務A多次讀取同一數(shù)據(jù)時蛮穿,結果因此本事務先后兩次讀到的數(shù)據(jù)結果會不一致。
可重復讀:在同一個事務里怕品,SELECT的結果是事務開始時時間點的狀態(tài),因此,同樣的SELECT操作讀到的結果會是一致的砌们。但是,會有幻讀現(xiàn)象
串行化:最高的隔離級別,在這個隔離級別下浪感,不會產(chǎn)生任何異常昔头。并發(fā)的事務,就像事務是在一個個按照順序執(zhí)行一樣