天天看點

《Oracle資料庫管理與維護實戰》——2.8 資料庫通路

本節書摘來自異步社群出版社《oracle資料庫管理與維護實戰》一書中的第2章,第2.8節,作者: 何偉娜 , 常建功,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

oracle資料庫管理與維護實戰

oracle是大型的多使用者并發資料庫系統,本節介紹使用oracle實作多使用者并發的基本概念和相關機制。

競争性、并發性與一緻性是所有多計算機系統都會遇到的問題。如計算機網絡中檔案伺服器阻止多個檔案同時修改同一個檔案,在windows平台下經常提示另一個使用者正在使用此檔案、不能修改等。當兩個使用者要同時擷取同一資源時,例如要同時擷取列印機,就會産生競争性。當多個使用者擷取同一資源,好像每個使用者在獨自使用該資源時,産生并發性。

oracle是一個多使用者資料庫系統,在它内部必須解決資源程序并發性與一緻性,使使用者對資料庫并發、安全的通路。oracle的并發性與一緻性機制并不會使資料庫的通路複雜化或降低系統性能。例如,如果幾個使用者同時想更新表中的同一記錄行,oracle會使用自動鎖機制,使事務串行發生,好像是獨立發生一樣。如事務要查詢另一個事務正在更新的表時,oracle的多版本機制自動允許查詢立即執行,并讓查詢讀取更新前的資料。

一緻性内最重要的是讀一緻性,oracle采取以下措施保證讀一緻性。

oracle保證sql語句在操作某些資料時,其他事務不能更改這些資料。

當一個事務讀資料庫資料時,這些資料也可以讓其他事務讀。

當一個事務在寫資料時,其他事務仍可正常讀這些資料。

但一個事務a在修改一行記錄時,其他要更改同一行記錄的事務必須要等到事務a完成更新後才能開始對這一行的更改。

多使用者資料庫系統中,事務具有幾種不同形式互相的影響,包括更新丢失、髒讀、非重複讀等。

1.更新丢失

系統允許多個事務同時更新同一資料時,會發生更新沖突。例如,兩個使用者都要更新同一表的同一行資料,一個更新就會覆寫掉另一個更新。為防止這種沖突發生,oracle采取鎖機制,防止同時發生更新操作。

2.髒讀

當一個事務讀取另一個打開事務還未送出的資料時,就會産生髒讀。例如,使用者a想修改某表中的一行記錄,如果該使用者還沒送出修改,而另一個使用者b想查詢這行記錄,如果傳回的是a使用者修改後的資料,就是髒讀。

oracle資料庫會盡量避免髒讀的産生,髒讀容易産生問題。如果讀取沒有送出的資料,而該資料送出失敗,那麼讀出的資料就是無效的,甚至是錯誤的。oracle中有一些機制能保證不出現髒讀。

3.可重複讀與非重複讀

在同一事務中,查詢傳回的是同一資料集,忽略其他已送出或未送出的事務所做的修改,這時發生可重複讀。隻有目前事務結束、又開始一個新的事務時,查詢才能看到最新的結果,這就是可重複讀。而如果查詢在相同的事務中多次進行,每次都傳回最新的資料集,這時發生非重複讀。