• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      常用關(guān)系數(shù)據(jù)庫(kù)并發(fā)控制的比較研究

      2010-11-25 02:37:16毛應(yīng)爽鄭永春
      制造業(yè)自動(dòng)化 2010年13期
      關(guān)鍵詞:缺省事務(wù)級(jí)別

      毛應(yīng)爽,鄭永春

      MAO Ying-shuang,ZHENG Yong-chun

      (長(zhǎng)春工程學(xué)院 軟件學(xué)院,長(zhǎng)春 130012)

      0 引言

      事務(wù)和鎖是并發(fā)控制的主要機(jī)制。在關(guān)系型數(shù)據(jù)庫(kù)中,事務(wù)可以確保用戶對(duì)數(shù)據(jù)庫(kù)邏輯操作的完整性和一致性。如有多個(gè)用戶同時(shí)建立與數(shù)據(jù)庫(kù)的會(huì)話,會(huì)發(fā)生多個(gè)事務(wù)互相干擾的問(wèn)題,各種關(guān)系數(shù)據(jù)庫(kù)都提供鎖機(jī)制來(lái)保證所有事務(wù)在執(zhí)行時(shí)都得到正確結(jié)果,以避免可能產(chǎn)生的幻讀、臟讀、不可重復(fù)讀等錯(cuò)誤。本文比較了Oralce和SQL Server數(shù)據(jù)庫(kù)的事務(wù)處理和鎖并說(shuō)明它們對(duì)并發(fā)控制處理的異同點(diǎn)。

      1 Oracle和Sql Server中的事務(wù)處理

      1.1 事務(wù)的類型

      Oracle采用隱式開(kāi)始一個(gè)事務(wù),缺省情況下任何一個(gè)DML語(yǔ)句都會(huì)開(kāi)始一個(gè)事務(wù),直到用戶發(fā)出Commit或Rollback命令,才會(huì)顯式結(jié)束事務(wù)該事務(wù)。

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

      1.2 DDL語(yǔ)句與事務(wù)控制

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

      Insert into myTable values(‘One’);

      Create table test(x int);

      Insert into myTable values(‘Two’);

      Rollback;

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

      相反,在Sql server的事務(wù)中如含有DDL語(yǔ)句,該DDL語(yǔ)句是可以被執(zhí)行回滾操作的。將上例的代碼在Sql server中執(zhí)行,則代碼應(yīng)為:

      Begin tran

      Insert into myTable values(‘One’)

      Create table test(x int)

      Insert into myTable values(‘Two’)

      Rollback tran

      Sql server將這3條語(yǔ)句作為同一事務(wù)處理,因此在執(zhí)行Rollback tran命令時(shí)會(huì)將插入myTable表中的One和Two以及新創(chuàng)建的表test都進(jìn)行回滾。在事務(wù)執(zhí)行過(guò)程中如果Create table語(yǔ)句失敗,則第1條insert語(yǔ)句也被回滾。如將Rollback tran更換成Commit tran命令,它將影響整個(gè)事務(wù)的提交。

      1.3 事務(wù)的提交模式

      在Oracle和Sql server中都有“自動(dòng)提交”模式。SQL Server中默認(rèn)的事務(wù)管理模式為自動(dòng)提交模式,即在使用 BEGIN TRANSACTION 語(yǔ)句啟動(dòng)顯式事務(wù)或者隱式事務(wù)模式設(shè)置為開(kāi)啟之前,與數(shù)據(jù)庫(kù)引擎實(shí)例的連接都以自動(dòng)提交模式操作,因此,每個(gè)語(yǔ)句在完成時(shí),都會(huì)被提交或回滾。而在Oracle中,通常只有在執(zhí)行了DDL語(yǔ)句或者在SQL*Plus中退出(Quit)某個(gè)用戶進(jìn)程時(shí)才會(huì)出現(xiàn)自動(dòng)提交,因?yàn)樵贒DL命令和quit命令的源代碼中已內(nèi)嵌了COMMIT命令。

      1.4 事務(wù)的隔離級(jí)別

      隔離級(jí)別定義了一個(gè)事務(wù)與其他事務(wù)的隔離程度,設(shè)置隔離級(jí)別,就為會(huì)話中的所有語(yǔ)句指定了缺省的鎖定行為,這雖可使程序員面臨的風(fēng)險(xiǎn)增加,但卻可以更好地支持?jǐn)?shù)據(jù)并發(fā)訪問(wèn)。在SQL92標(biāo)準(zhǔn)中,事務(wù)隔離級(jí)別分為Read Uncommitted、Read Committed、Read Repeatable、Serializable四種,其中Read Uncommitted與Read Committed為語(yǔ)句級(jí)別的,而Read Repeatable與Serializable是針對(duì)事務(wù)級(jí)別的。

      1.4.1 Oracle的事務(wù)隔離級(jí)別

      Oracle支持SQL92標(biāo)準(zhǔn)中的Read Committed 和Serializable兩個(gè)隔離級(jí)別,并支持非SQL 92標(biāo)準(zhǔn)的Read Only和Read Write隔離級(jí)別。Read Committed是Oracle的默認(rèn)隔離級(jí)別,Read Only是Serializable子集,都能避免非重復(fù)讀和幻讀,其區(qū)別在于Read Only是只讀的,而在Serializable中可以進(jìn)行DML操作。

      Oralce事務(wù)處理的一個(gè)優(yōu)勢(shì)是它使用回滾段或撤銷段來(lái)存放記錄被修改前的結(jié)果,使讀取和更新操作互不阻礙,快速進(jìn)行,即讀取操作不必等待更新事務(wù)結(jié)束,更新操作也不必因?yàn)榱硪皇聞?wù)中的讀取操作而等待。

      1.4.2 Sql server的事務(wù)隔離級(jí)別

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

      2 Oracle和Sql Server中的鎖

      鎖是為防止其他事務(wù)訪問(wèn)指定的資源,對(duì)并發(fā)控制的事務(wù)進(jìn)行的一種保護(hù)機(jī)制。當(dāng)某個(gè)數(shù)據(jù)庫(kù)對(duì)象正被其他進(jìn)程或用戶修改時(shí),鎖機(jī)制可以保護(hù)它不被修改,因而鎖是實(shí)現(xiàn)并發(fā)控制的主要手段。

      2.1 鎖的粒度

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

      Oralce與SQL Server的鎖粒度都包括行級(jí)鎖、表級(jí)別鎖、數(shù)據(jù)庫(kù)級(jí)別鎖。其中SQL Server還擁有頁(yè)級(jí)鎖和簇級(jí)鎖。使用頁(yè)級(jí)鎖是因?yàn)镾QL Server要求表中的行不能跨頁(yè)存放,在事務(wù)操作過(guò)程中無(wú)論處理多少數(shù)據(jù),每次都鎖定一頁(yè)。而簇級(jí)鎖主要是當(dāng)事務(wù)占用一個(gè)簇(8個(gè)連續(xù)頁(yè))時(shí)其他事務(wù)不能占用該簇,主要用于創(chuàng)建數(shù)據(jù)庫(kù)和表時(shí),系統(tǒng)用簇級(jí)鎖分配物理空間。

      2.2 鎖類型

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

      Oralce和SQL Server的鎖機(jī)制對(duì)用戶都是透明的,即系統(tǒng)能自動(dòng)提供對(duì)應(yīng)的等級(jí)鎖來(lái)鎖定資源,不需要用戶專門設(shè)置。

      2.3 死鎖比較

      死鎖是指在兩個(gè)以上的事務(wù)中,每個(gè)事務(wù)都因?yàn)樵噲D加鎖當(dāng)前已被另一個(gè)事務(wù)加鎖的數(shù)據(jù)項(xiàng),從而造成的互相等待的現(xiàn)象。Oralce和SQL Server都能自動(dòng)、有效地對(duì)死鎖進(jìn)行檢測(cè)。所不同的是,當(dāng)檢測(cè)到死鎖后,Oralce會(huì)選擇一個(gè)執(zhí)行修改數(shù)目最小的事務(wù)退出,被退出的事務(wù)會(huì)接收到一個(gè)錯(cuò)誤信息,通知它所要訪問(wèn)的資源已經(jīng)被另外的事務(wù)鎖定,但Oralce不會(huì)自動(dòng)回滾該事務(wù),因此該事務(wù)鎖定的資源仍未釋放,解決方法是執(zhí)行ROLLBACK或COMMIT語(yǔ)句或使用ALTER SYSTEM KILL SESSION語(yǔ)句終止該會(huì)話。而SQL Server在檢測(cè)到死鎖后,則會(huì)自動(dòng)回滾其中一個(gè)事務(wù)并返回一個(gè)錯(cuò)誤到連接對(duì)象,用此解決死鎖并讓其他事務(wù)繼續(xù)完成工作。

      2.4 鎖爭(zhēng)用的監(jiān)測(cè)

      ORACLE用動(dòng)態(tài)性能視圖V$LOCK和V$locked_OBJECT監(jiān)測(cè)會(huì)話時(shí)鎖的信息,V$LOCK包含所有當(dāng)前由系統(tǒng)和所連接的會(huì)話保持的鎖的信息,V$locked_OBJECT則提供當(dāng)前被鎖定的對(duì)象由什么鎖模式鎖定。SQL SERVER可采用調(diào)用系統(tǒng)存儲(chǔ)過(guò)程SP_LOCK和SP_WHO,或直接查詢系統(tǒng)表syslockinfo,或使用SSMS的活動(dòng)監(jiān)視器和SQL Profiler來(lái)瀏覽監(jiān)測(cè)鎖活動(dòng)。

      3 結(jié)束語(yǔ)

      事務(wù)和鎖是并發(fā)控制的主要機(jī)制,針對(duì)不同的數(shù)據(jù)庫(kù),用戶在使用時(shí)應(yīng)注意選擇恰當(dāng)?shù)氖聞?wù)隔離級(jí)別,避免應(yīng)用過(guò)長(zhǎng)的事務(wù),應(yīng)在非高峰期間執(zhí)行DDL操作和執(zhí)行長(zhǎng)時(shí)間運(yùn)行的查詢或事務(wù),在實(shí)際應(yīng)用中應(yīng)仔細(xì)設(shè)計(jì)以防止鎖爭(zhēng)用的事務(wù)出現(xiàn),并且對(duì)鎖進(jìn)行監(jiān)控,解決死鎖。

      參考資料:

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

      [2]馬曉玉.Oracle 10g數(shù)據(jù)庫(kù)管理 應(yīng)用與開(kāi)發(fā)標(biāo)準(zhǔn)教程[M].清華大學(xué)出版社,2007,11.

      [3]sql server 2005聯(lián)機(jī)叢書.微軟公司,sql server 2005文檔.

      猜你喜歡
      缺省事務(wù)級(jí)別
      “事物”與“事務(wù)”
      基于分布式事務(wù)的門架數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
      痘痘分級(jí)別,輕重不一樣
      基于“缺省模式”設(shè)計(jì)平臺(tái)的控制系統(tǒng)研發(fā)模式重塑
      河湖事務(wù)
      邁向UHD HDR的“水晶” 十萬(wàn)元級(jí)別的SIM2 CRYSTAL4 UHD
      新年導(dǎo)購(gòu)手冊(cè)之兩萬(wàn)元以下級(jí)別好物推薦
      你是什么級(jí)別的
      缺省語(yǔ)義模式下話語(yǔ)交際意義研究
      關(guān)聯(lián)期待與缺省推理下缺省語(yǔ)境的生成模式
      达孜县| 建平县| 突泉县| 洛扎县| 顺平县| 饶平县| 安丘市| 工布江达县| 长阳| 洛宁县| 武陟县| 龙海市| 扬中市| 罗田县| 秭归县| 元江| 永吉县| 永昌县| 荣昌县| 峨边| 长葛市| 内黄县| 锦屏县| 江川县| 威海市| 东辽县| 疏勒县| 乌兰县| 莎车县| 鹤壁市| 通化市| 凤台县| 准格尔旗| 沁水县| 曲沃县| 磐安县| 额敏县| 耒阳市| 盐边县| 云安县| 新野县|