?

常用關系數據庫并發控制的比較研究

2010-11-25 02:37毛應爽鄭永春
制造業自動化 2010年13期
關鍵詞:缺省事務命令

毛應爽,鄭永春

MAO Ying-shuang,ZHENG Yong-chun

(長春工程學院 軟件學院,長春 130012)

0 引言

事務和鎖是并發控制的主要機制。在關系型數據庫中,事務可以確保用戶對數據庫邏輯操作的完整性和一致性。如有多個用戶同時建立與數據庫的會話,會發生多個事務互相干擾的問題,各種關系數據庫都提供鎖機制來保證所有事務在執行時都得到正確結果,以避免可能產生的幻讀、臟讀、不可重復讀等錯誤。本文比較了Oralce和SQL Server數據庫的事務處理和鎖并說明它們對并發控制處理的異同點。

1 Oracle和Sql Server中的事務處理

1.1 事務的類型

Oracle采用隱式開始一個事務,缺省情況下任何一個DML語句都會開始一個事務,直到用戶發出Commit或Rollback命令,才會顯式結束事務該事務。

而SQL Server有隱式事務和顯式事務兩種事務類型。默認情況下,SQL Server認為每個語句都是獨立的一個事務并提交它,即隱式事務;如果某個事務需要包含多個語句,則需要使用顯式事務,它必須封裝在BEGIN TRAN和COMMIT TRAN或ROLLBACK TRAN語句組中。

1.2 DDL語句與事務控制

在Oracle中,Commit和Rollback語句只能應用于DML語句,而不應用于DDL語句,即一旦執行了DDL語句,則該語句首先隱含執行一個commit,在語句完成時也隱含執行一個commit命令,即將自動提交DDL語句前的事務和DDL語句本身的事務。因此,在執行了DDL命令后事務將無法回滾。例如在Oracle的sql*plus中執行以下代碼:

Insert into myTable values(‘One’);

Create table test(x int);

Insert into myTable values(‘Two’);

Rollback;

由于在執行Create table語句時先隱含進行了提交,然后創建表,執行后又進行隱含提交,所以該程序只有第2條INSERT語句即插入數據Two的行被回滾,而插入One的行和創建的表都不被回滾,即使Create table語句失敗,第1條INSERT語句也會被提交。如果最后Rollback更換成Commit命令,Commit命令也只影響第2條INSERT語句的操作。

相反,在Sql server的事務中如含有DDL語句,該DDL語句是可以被執行回滾操作的。將上例的代碼在Sql server中執行,則代碼應為:

Begin tran

Insert into myTable values(‘One’)

Create table test(x int)

Insert into myTable values(‘Two’)

Rollback tran

Sql server將這3條語句作為同一事務處理,因此在執行Rollback tran命令時會將插入myTable表中的One和Two以及新創建的表test都進行回滾。在事務執行過程中如果Create table語句失敗,則第1條insert語句也被回滾。如將Rollback tran更換成Commit tran命令,它將影響整個事務的提交。

1.3 事務的提交模式

在Oracle和Sql server中都有“自動提交”模式。SQL Server中默認的事務管理模式為自動提交模式,即在使用 BEGIN TRANSACTION 語句啟動顯式事務或者隱式事務模式設置為開啟之前,與數據庫引擎實例的連接都以自動提交模式操作,因此,每個語句在完成時,都會被提交或回滾。而在Oracle中,通常只有在執行了DDL語句或者在SQL*Plus中退出(Quit)某個用戶進程時才會出現自動提交,因為在DDL命令和quit命令的源代碼中已內嵌了COMMIT命令。

1.4 事務的隔離級別

隔離級別定義了一個事務與其他事務的隔離程度,設置隔離級別,就為會話中的所有語句指定了缺省的鎖定行為,這雖可使程序員面臨的風險增加,但卻可以更好地支持數據并發訪問。在SQL92標準中,事務隔離級別分為Read Uncommitted、Read Committed、Read Repeatable、Serializable四種,其中Read Uncommitted與Read Committed為語句級別的,而Read Repeatable與Serializable是針對事務級別的。

1.4.1 Oracle的事務隔離級別

Oracle支持SQL92標準中的Read Committed 和Serializable兩個隔離級別,并支持非SQL 92標準的Read Only和Read Write隔離級別。Read Committed是Oracle的默認隔離級別,Read Only是Serializable子集,都能避免非重復讀和幻讀,其區別在于Read Only是只讀的,而在Serializable中可以進行DML操作。

Oralce事務處理的一個優勢是它使用回滾段或撤銷段來存放記錄被修改前的結果,使讀取和更新操作互不阻礙,快速進行,即讀取操作不必等待更新事務結束,更新操作也不必因為另一事務中的讀取操作而等待。

1.4.2 Sql server的事務隔離級別

SQL Server支持SQL92標準所定義的4種隔離級別,其缺省的隔離級別為 Read Committed,在這種隔離級別下,讀取和更新操作有時是相互阻礙的,如一個會話正在對某表進行更新操作,而另一個會話同時對該表進行讀取操作,則該會話需要等待更新事務結束后才能進行讀取操作。另外SQL Server允許為事務設置Read Uncommitted隔離級別,該設置使一個會話可以讀取其他事務未提交的更新結果,假如該事務最后以回滾結束,則讀取的結果就可能是錯誤的。

2 Oracle和Sql Server中的鎖

鎖是為防止其他事務訪問指定的資源,對并發控制的事務進行的一種保護機制。當某個數據庫對象正被其他進程或用戶修改時,鎖機制可以保護它不被修改,因而鎖是實現并發控制的主要手段。

2.1 鎖的粒度

鎖粒度是指被鎖定的數據對象的大小,要加快事務的處理速度并縮短事務的等待時間,就要使事務鎖定的資源最小。

Oralce與SQL Server的鎖粒度都包括行級鎖、表級別鎖、數據庫級別鎖。其中SQL Server還擁有頁級鎖和簇級鎖。使用頁級鎖是因為SQL Server要求表中的行不能跨頁存放,在事務操作過程中無論處理多少數據,每次都鎖定一頁。而簇級鎖主要是當事務占用一個簇(8個連續頁)時其他事務不能占用該簇,主要用于創建數據庫和表時,系統用簇級鎖分配物理空間。

2.2 鎖類型

Oralce 和SQL Server最基本的鎖類型有共享鎖、排他鎖、更新鎖,而SQL Server還專門提供了意向鎖,意向鎖是其他幾種鎖類型的變體,包括意向共享鎖、意向排他鎖等。Oralce 和SQL Server都可以由以上基本鎖類型進行組合以演變出更多的鎖。

Oralce和SQL Server的鎖機制對用戶都是透明的,即系統能自動提供對應的等級鎖來鎖定資源,不需要用戶專門設置。

2.3 死鎖比較

死鎖是指在兩個以上的事務中,每個事務都因為試圖加鎖當前已被另一個事務加鎖的數據項,從而造成的互相等待的現象。Oralce和SQL Server都能自動、有效地對死鎖進行檢測。所不同的是,當檢測到死鎖后,Oralce會選擇一個執行修改數目最小的事務退出,被退出的事務會接收到一個錯誤信息,通知它所要訪問的資源已經被另外的事務鎖定,但Oralce不會自動回滾該事務,因此該事務鎖定的資源仍未釋放,解決方法是執行ROLLBACK或COMMIT語句或使用ALTER SYSTEM KILL SESSION語句終止該會話。而SQL Server在檢測到死鎖后,則會自動回滾其中一個事務并返回一個錯誤到連接對象,用此解決死鎖并讓其他事務繼續完成工作。

2.4 鎖爭用的監測

ORACLE用動態性能視圖V$LOCK和V$locked_OBJECT監測會話時鎖的信息,V$LOCK包含所有當前由系統和所連接的會話保持的鎖的信息,V$locked_OBJECT則提供當前被鎖定的對象由什么鎖模式鎖定。SQL SERVER可采用調用系統存儲過程SP_LOCK和SP_WHO,或直接查詢系統表syslockinfo,或使用SSMS的活動監視器和SQL Profiler來瀏覽監測鎖活動。

3 結束語

事務和鎖是并發控制的主要機制,針對不同的數據庫,用戶在使用時應注意選擇恰當的事務隔離級別,避免應用過長的事務,應在非高峰期間執行DDL操作和執行長時間運行的查詢或事務,在實際應用中應仔細設計以防止鎖爭用的事務出現,并且對鎖進行監控,解決死鎖。

參考資料:

[1]Oracle Database 10g OCP Certification All-in-One Exam Guide John Watson著.清華大學出版社,2007,4.

[2]馬曉玉.Oracle 10g數據庫管理 應用與開發標準教程[M].清華大學出版社,2007,11.

[3]sql server 2005聯機叢書.微軟公司,sql server 2005文檔.

猜你喜歡
缺省事務命令
只聽主人的命令
基于“缺省模式”設計平臺的控制系統研發模式重塑
河湖事務
移防命令下達后
基于條件隨機場的評價對象缺省項識別
這是人民的命令
基于優先級的多版本兩階段鎖并發控制協議
觀點句中評價對象/屬性的缺省項識別方法研究
淺析Oracle事務
移動實時環境下的數據一致性研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合