一個數(shù)據(jù)庫可能擁有多個訪問客戶端,這些客戶端并發(fā)訪問數(shù)據(jù)庫時煞烫,若沒有采取必要的隔離措施浑此,存在以下問題,這些問題分為5類滞详,包括3類數(shù)據(jù)讀問題:臟讀凛俱、不可重復(fù)讀和幻讀。兩類數(shù)據(jù)更新問題:第一類丟失更新料饥、第二類丟失更新最冰。
1.臟讀
A事務(wù)讀取B事務(wù)尚未提交的更改數(shù)據(jù),并在這個數(shù)據(jù)的基礎(chǔ)上進(jìn)行操作稀火,這時候如果事務(wù)B回滾暖哨,那么A事務(wù)讀到的數(shù)據(jù)是不被承認(rèn)的。例如常見的取款事務(wù)和轉(zhuǎn)賬事務(wù):
2.不可重復(fù)讀
不可重復(fù)讀是指A事務(wù)讀取了B事務(wù)已經(jīng)提交的更改數(shù)據(jù)凰狞。假如A在取款事務(wù)的過程中篇裁,B往該賬戶轉(zhuǎn)賬100,A兩次讀取的余額發(fā)生不一致赡若。
3.幻讀
A事務(wù)讀取B事務(wù)提交的新增數(shù)據(jù),會引發(fā)幻讀問題达布。幻讀一般發(fā)生在計算統(tǒng)計數(shù)據(jù)的事務(wù)中逾冬,例如銀行系統(tǒng)在同一個事務(wù)中兩次統(tǒng)計存款賬戶的總金額黍聂,在兩次統(tǒng)計中,剛好新增了一個存款賬戶身腻,存入了100产还,這時候兩次統(tǒng)計的總金額不一致。
注意:不可重復(fù)讀和幻讀的區(qū)別是:前者是指讀到了已經(jīng)提交的事務(wù)的更改數(shù)據(jù)(修改或刪除)嘀趟,后者是指讀到了其他已經(jīng)提交事務(wù)的新增數(shù)據(jù)脐区。對于這兩種問題解決采用不同的辦法,防止讀到更改數(shù)據(jù)她按,只需對操作的數(shù)據(jù)添加行級鎖牛隅,防止操作中的數(shù)據(jù)發(fā)生變化炕柔;二防止讀到新增數(shù)據(jù),往往需要添加表級鎖媒佣,將整張表鎖定匕累,防止新增數(shù)據(jù)(oracle采用多版本數(shù)據(jù)的方式實現(xiàn))。
4.第一類丟失更新
A事務(wù)撤銷時默伍,把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了哩罪。例如:
這時候取款事務(wù)A撤銷事務(wù),余額恢復(fù)為1000巡验,這就丟失了更新际插。
5.第二類丟失更新
A事務(wù)覆蓋B事務(wù)已經(jīng)提交的數(shù)據(jù),造成B事務(wù)所做的操作丟失
為了解決上述問題显设,數(shù)據(jù)庫通過鎖機(jī)制解決并發(fā)訪問的問題框弛。根據(jù)鎖定對象不同:分為行級鎖和表級鎖;根據(jù)并發(fā)事務(wù)鎖定的關(guān)系上看:分為共享鎖定和獨占鎖定捕捂,共享鎖定會防止獨占鎖定但允許其他的共享鎖定瑟枫。而獨占鎖定既防止共享鎖定也防止其他獨占鎖定。為了更改數(shù)據(jù)指攒,數(shù)據(jù)庫必須在進(jìn)行更改的行上施加行獨占鎖定慷妙,insert、update允悦、delete和selsct for update語句都會隱式采用必要的行鎖定膝擂。
但是直接使用鎖機(jī)制管理是很復(fù)雜的,基于鎖機(jī)制隙弛,數(shù)據(jù)庫給用戶提供了不同的事務(wù)隔離級別架馋,只要設(shè)置了事務(wù)隔離級別,數(shù)據(jù)庫就會分析事務(wù)中的sql語句然后自動選擇合適的鎖全闷。
不同的隔離級別對并發(fā)問題的解決情況如圖:
注意:事務(wù)的隔離級別和數(shù)據(jù)庫并發(fā)性是成反比的叉寂,隔離級別越高,并發(fā)性越低总珠。