時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
現(xiàn)在主流的數(shù)據(jù)庫管理系統(tǒng)中,都支持多個事務(wù)同時執(zhí)行,這樣提高了數(shù)據(jù)庫管理系統(tǒng)的運行效率。試想如果只允許一個事務(wù)運行,而這個事務(wù)又需要很長的時間,那么其他的用戶必須一直等待該事務(wù)結(jié)束,效率何其低下。執(zhí)行不同的事務(wù)雖然可以提高性能,但是有可能會破壞數(shù)據(jù)的完整性,所以我們必須在性能和數(shù)據(jù)完整性之間進行權(quán)衡。那么什么是并發(fā)控制呢?并發(fā)控制是數(shù)據(jù)庫管理系統(tǒng)協(xié)調(diào)多個運行事務(wù)的行為。首先了解一下,并發(fā)控制中經(jīng)常遇到的三個問題。
臟讀
我們通過一個products表來解釋一下什么是臟讀,該products表有一列quantity(數(shù)量),現(xiàn)在的值為20。假如現(xiàn)在有兩個事務(wù)T1和T2,它們都是要更新quantity列,T1將該列值加100,T2將此列減10,但是T1執(zhí)行失敗進行了回滾。我們很容易計算出正確的結(jié)果20-10=10,但是如果事務(wù)按照以下方式運行,能夠得出什么結(jié)果?
時間 事務(wù) 步驟 存儲值
1 T1 讀出quantity的值 20
2 T1 quantity=20+100 120
3 T1 寫入quantity值 120
4 T2 讀出quantity(T1未提交) 120
5 T2 quantity=120-10 110
6 T1 回滾(rollback) 20
7 T2 寫入quantity值 110
以上得出了110的結(jié)果,顯然是不正確的,問題就在于T2讀取到了T1沒有提交的數(shù)據(jù),我們把這種情況就稱之為臟讀。
不可重復(fù)讀
還是事務(wù)T1和T2,它們都是要更新quantity列,T1將該列值加100,T2將此列減10,而且兩個事務(wù)都成功。我們很容易計算出正確的結(jié)果20+100-10=110,但是如果事務(wù)按照以下方式運行,能夠得出什么結(jié)果?
時間 事務(wù) 步驟 存儲值
1 T1 讀出quantity的值 20
2 T2 讀出quantity的值 20
3 T1 quantity=20+100 120
4 T2 quantity=20-10 10
5 T1 寫入quantity值(更新丟失) 110
6 T2 寫入quantity值 10
得出了10的結(jié)果,仍然是不正確的。問題就在于T2的值覆蓋了T1的值,我們把這種情況稱之為不可重復(fù)讀。
幻覺讀
例如T1對一個表中的所有行修改,同時T2向該表中插入一行記錄。這時在T1中就會發(fā)生還有沒有被修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。
SQL92標準定義了四種隔離級別,以解決以上問題,四種隔離級別如下圖所示:
關(guān)鍵詞標簽:Oracle
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列oracle中使用SQL語句修改字段類型-oracle修使用低權(quán)限Oracle數(shù)據(jù)庫賬戶得到管理員權(quán)限Oracle對user的訪問控制
人氣排行 ORACLE SQL 判斷字符串是否為數(shù)字的語句Oracle中使用alter table來增加,刪除,修改列的語法ORACLE和SQL語法區(qū)別歸納(1)oracle grant 授權(quán)語句如何加速Oracle大批量數(shù)據(jù)處理Oracle刪除表的幾種方法ORACLE修改IP地址后如何能夠使用Oracle 10g創(chuàng)建表空間和用戶并指定權(quán)限