數據庫并發處理
2024-07-21 02:09:25
供稿:網友
數據庫并發處理 一、并發處理
數據庫的特點就是數據的集中管理和共享。在通常情況下總是有若干個事務并發地運行,這些并行的事務可能并發地存取相同的數據。因此,數據庫管理系統的一個重要任務就是要有一種機制去保證這種并發的存取和修改不破壞數據的完整性,確保這些事務能正確地運行并取得正確的結果。
我們知道,事務并發執行時若不加控制的話,將導致不正確的結果和數據庫的不一致狀態。為保證數據庫數據正確地反映所有事務的更新,以及在一事務修改數據時其它事務不同時修改這個數據,數據庫系統用鎖來控制對數據的并發存取。
二、oracle的并發處理機制
無需任何說明,oracle自動提供行級鎖,它允許用戶在沒有沖突的情況下更新表中不同的行。行級鎖對聯機事務處理非常有用。
1、oracle鎖
oracle鎖的類型在正常情況下,oracle會自動鎖住需要加鎖的資源以保護數據,
這種鎖是隱含的,叫隱含鎖。然而,在一些條件下,這些自動的鎖在實際應用時并不能滿足需要,必須人工加一些鎖。這些人工加的鎖叫顯示鎖。
下面指明了會產生隱含鎖的sql語句:
insert;
update;
delete;
ddl/dcl語句。
下面指明了會產生顯示鎖的sql語句:
select for update;
lock table inxxx mode。
解決讀的不可重復性可以用下面的方法。在oracle中,用select for update對預期要修改的記錄加行排它鎖(x),對表加行共享鎖(rs)。它常用于要鎖住一行,但不去真的修改這一行。鎖之間是有相互作用的。
例如,更新時會對表加rx鎖,對行加x鎖,而只有rs鎖和rx鎖允許再加rx鎖。因此,當存在rs和rx鎖時,表允許更新。再比如,當執行ddl和dcl語句時,會對表加排它鎖x,而在存在x、rs、srx、rx和s鎖的前提下,都不能再加x鎖。因此,當存在x,rs,srx,rs或s鎖時,不能對表做dcl和ddl操作。這樣,數據庫會自動防止一個用戶更新表中的數據,而其他用戶在同時修改表的結構。
2、oracle只讀事務
oracle支持只讀事務。只讀事務有以下特點:
*在事務中只允許查詢
*其它事務可修改和查詢數據
*在事務中,其它用戶的任何修改都看不見
只讀事務的寫法為:
set trans action readonly
sql語句
commit,rollback,ddl結束只讀事務
3、事務一致性的級別
事務是定義和維護一致性的單位,封鎖就是要保證這種一致性。如果對封鎖的要求高會增加開銷,降低并發性和效率;有的事務并不嚴格要求結果的質量(如用于統計的事務),如果加上嚴格的封鎖則是不必要和不經濟的。因此有必要進行進一步的分析,考察不同級別的一致性對數據庫數據的質量及并行能力的影響。
一致性級別定義為如下的幾個條件:
1) 事務不修改其它任何事務的臟數據。臟數據是被其它事務修改過,但尚未提交的數據。
2) 在事務結束前不對被修改的資源解鎖。
3) 事務不讀其它任何事務的臟數據。
4) 在讀前對數據加共享鎖(rs)和行排它鎖,直至事務結束。
*滿足條件1的事務叫第0級事務。
*滿足條件1和2的事務叫第1級一致性事務。
*滿足條件1、2和3的事務為2級一致性事務。
oracle的讀一致性保證了事務不讀其它事務的臟數據。
*滿足條件1、2、3和4的事務叫第3級一致性事務。
由oracle的三個性質:自動加隱式鎖、在事務結束時釋放鎖和讀一致性,使oracle成為自動滿足以上的0、1和2級一致性事務。因此,oracle自動防止了臟讀(寫-讀依賴)。但是,oracle不能自動防止丟失修改(寫-寫依賴),讀的不可重復性(讀-寫依賴),徹底解決并發性中的問題還需滿足第4個條件(3級一致性事務),這需要程序員根據實際情況編程。
方法如下:
*如果想在一段時間內使一些數據不被其它事務改變,且在本事務內僅僅查詢數據,則可用settransactionreadonly語句達到這一目的。
*如果想在一事務內修改一數據,且避免丟失修改,則應在讀這一數據前用selectforupdate對該數據加鎖。
*如果想在一事務內讀一數據,且想基于這一數據對其它數據修改,則應在讀數據前對此數據用selectforupdate加鎖。對此種類型的應用,用這條sql語句加鎖最恰當。
*如果想避免不可重復讀現象,可在讀前用selectforupdate對數據加鎖,或用set trans action readonly設置只讀事務。
三、sybase的并發處理機制
sybase的并發處理方法與oracle類似,但在很多方面不一樣。sybase有兩種粒度的封鎖,一種的粒度是頁,另一種的粒度是表。sybase根據sql語句的情況決定用頁封鎖還是用表封鎖。
1、頁級鎖
頁級鎖有以下所始的三類:
*shared:在讀操作時加共享鎖。在缺省狀態下,在讀操作完成后釋放共享鎖。
*exclusive:在更新操作時加排它鎖。在缺省狀態下,在事務完成后釋放排它鎖。
*update:在修改和刪除操作的初期(讀到被修改或刪除的頁時)加修改鎖。在表上加了修改鎖之后,還可以再加共享鎖,但不能再加修改和排它鎖。在進行修改和刪除操作時,如果沒有共享鎖存在,修改鎖則轉化為排它鎖。此鎖的目的是為了防止死鎖。sybase僅當在where子句中包含索引列時才會使用頁級的排它鎖和修改鎖。
2、表級鎖
表級鎖有以下所示的三類:
*intent:當表中存在頁級的排它鎖和共享鎖時,在表上加意向鎖。在所有的頁級鎖釋放后,意向鎖隨著釋放。
*shared:在讀操作時加共享鎖。在缺省狀態下,在讀操作完成后釋放共享鎖。
*exclusive:在更新操作時加排它鎖。在缺省狀態下,在事務完成后釋放排它鎖。
3、請求鎖
請求鎖用以防止共享鎖一個接一個無休止地加在表上,從而寫事務(要加排它鎖)無法進行。
4、sybase的封鎖級別
在sybase根據ansi標準定義事務的封鎖級別:
(1) 級別1:臟讀
(2) (2)級別2:不可重復讀
(3) (3)光標帶來的當前值混亂
(4) sybase的缺省一致性級別為1。
如果要達到一致性級別2和3,必須使用holdlock關鍵字把共享鎖持續到事務的結束。方法如下:
select*from auths holdlock
where author_code='a00001'
sybase還可以通過t-sql的set命令改變sybase的一致性級別,從而使sybase自動在select語句中加holdlock關鍵字:
set trans action is olation level3
5、在sybase中提高并發效率的方法
*避免在表中特定的頁上多個用戶過多的封鎖。
*避免在人機交互的應用中定義事務,這樣會使某個用戶長時間封鎖
住表(如去接電話),使其他用戶持續等待。
*使事務盡量的短。
*僅當必要時才使用holdlock關鍵字。
,歡迎訪問網頁設計愛好者web開發。