1.oracle對(duì)一條sql語(yǔ)句的執(zhí)行是怎么管理并發(fā)和恢復(fù)控制的?
          一條符合語(yǔ)法的sql語(yǔ)句,定義了對(duì)數(shù)據(jù)庫(kù)的操作。此操作執(zhí)行的時(shí)刻,對(duì)應(yīng)了數(shù)據(jù)庫(kù)的一個(gè)數(shù)據(jù)狀態(tài)。可以這樣理解這個(gè)狀態(tài):到此執(zhí)行時(shí)刻為止,沒(méi)有任何數(shù)據(jù)庫(kù)語(yǔ)句級(jí)操作正在并發(fā)執(zhí)行;就是說(shuō)實(shí)際上正在并發(fā)執(zhí)行的多個(gè)語(yǔ)句級(jí)操作可以假定在此語(yǔ)句操作之后執(zhí)行。這里強(qiáng)調(diào)語(yǔ)句級(jí)操作,是指如果一個(gè)事務(wù)包含多個(gè)操作語(yǔ)句,在此時(shí)刻實(shí)際已經(jīng)執(zhí)行了其中幾個(gè),此時(shí)刻也正在執(zhí)行某一個(gè)語(yǔ)句,那么不能簡(jiǎn)單地認(rèn)為前面幾個(gè)執(zhí)行的操作語(yǔ)句也還沒(méi)發(fā)生,這是要看事務(wù)的隔離級(jí)別的,但是不管事務(wù)隔離級(jí)別是幾級(jí),語(yǔ)句級(jí)別上可以認(rèn)為是序列執(zhí)行的。
          該sql語(yǔ)句的操作過(guò)程中認(rèn)為此數(shù)據(jù)狀態(tài)是保持不變的。當(dāng)此操作執(zhí)行結(jié)束時(shí)刻,才產(chǎn)生語(yǔ)句級(jí)數(shù)據(jù)狀態(tài)影響。就是說(shuō),可能該語(yǔ)句同時(shí)更新了兩行,但都用了同一個(gè)主鍵,則此時(shí)會(huì)導(dǎo)致違反唯一性約定而消除整個(gè)語(yǔ)句的影響,如果成功執(zhí)行,但未必就在事務(wù)級(jí)別上影響數(shù)據(jù)狀態(tài),就是說(shuō)如果所在事務(wù)回滾,此影響仍然被消除,不過(guò)正如前面所說(shuō),一個(gè)語(yǔ)句成功執(zhí)行后,就可能影響其他語(yǔ)句所面對(duì)的數(shù)據(jù)狀態(tài)。 
          2.PL/SQL的執(zhí)行是怎么管理并發(fā)和恢復(fù)控制的?
          PL/SQL是在一個(gè)PL/SQL引擎中執(zhí)行的。該引擎可以認(rèn)為是oracle之外的單位。該引擎會(huì)解析PL/SQL,并不斷發(fā)送SQL語(yǔ)句給ORACLE。所以和用JAVA程序通過(guò)JDBC在一個(gè)會(huì)話連接中發(fā)送多個(gè)SQL語(yǔ)句沒(méi)有本質(zhì)差別。也因此并發(fā)和恢復(fù)管理沒(méi)有不同。
          3.oracle死鎖是怎么樣產(chǎn)生的?
          由于oracle控制并發(fā)是使用的鎖機(jī)制,也因此即會(huì)產(chǎn)生死鎖問(wèn)題。oracle在執(zhí)行一個(gè)語(yǔ)句時(shí),會(huì)根據(jù)語(yǔ)句的含義,同時(shí)根據(jù)所處的事務(wù)隔離級(jí)別,解析出需要加什么樣的鎖,什么時(shí)候釋放。而隔離級(jí)別越高,對(duì)鎖資源占用越大。現(xiàn)在考慮這樣的情形,oracle同時(shí)處理兩個(gè)事務(wù)A,B。A發(fā)過(guò)來(lái)幾條語(yǔ)句,導(dǎo)致ORACLE加了幾把鎖沒(méi)有釋放,B發(fā)過(guò)來(lái)幾條語(yǔ)句,導(dǎo)致ORACLE加了另外幾把鎖沒(méi)有釋放,現(xiàn)在,A又發(fā)過(guò)來(lái)一個(gè)語(yǔ)句,此語(yǔ)句要求ORACLE加的一些鎖中,有幾個(gè)鎖已經(jīng)被B事務(wù)占用,那么A等待,而B又發(fā)過(guò)來(lái)一條語(yǔ)句,此語(yǔ)句要求ORACLE加的鎖,在A手中。于是死鎖出現(xiàn)。而隔離級(jí)別越高,死鎖的可能性越大。可以分析出來(lái),死鎖的根本原因在于,事務(wù)包含的語(yǔ)句是分條發(fā)給oracle的,oracle不能夠在事務(wù)開(kāi)始時(shí)刻就解析出全部執(zhí)行過(guò)程需要什么鎖,什么時(shí)候釋放,無(wú)法統(tǒng)一安排。

          死鎖問(wèn)題歸咎由誰(shuí)呢?我這么理解:如果沒(méi)有事務(wù)概念,oracle在語(yǔ)句級(jí)上控制并發(fā),完全不會(huì)出現(xiàn)死鎖問(wèn)題。因?yàn)樵诮馕稣Z(yǔ)句時(shí),oracle已經(jīng)知道要加多少把鎖,它會(huì)看目前這些鎖如果能全部獲得就執(zhí)行,否則就等待。可是實(shí)際應(yīng)用怎么能沒(méi)有事務(wù)的概念呢?我同意完全可以出現(xiàn)新的sql語(yǔ)法,可以把原來(lái)的多條sql語(yǔ)句的含義在一個(gè)語(yǔ)句中定義完畢,長(zhǎng)短不是問(wèn)題,犧牲一定的語(yǔ)法簡(jiǎn)潔度也不是問(wèn)題;然而最關(guān)鍵的是往往我們是在一個(gè)業(yè)務(wù)處理邏輯中,多個(gè)數(shù)據(jù)庫(kù)操作之間摻雜了其他非數(shù)據(jù)庫(kù)操作,而又想獲取這些數(shù)據(jù)庫(kù)操作作為一個(gè)整體的ACID。因此事務(wù)概念必須存在。既然如此,或許我們真得可以把一個(gè)事務(wù)可能包含的語(yǔ)句在事務(wù)開(kāi)始時(shí)就交給oracle,盡管這樣一來(lái),有可能就包含了實(shí)際通過(guò)業(yè)務(wù)邏輯判斷不會(huì)執(zhí)行的語(yǔ)句,導(dǎo)致oracle浪費(fèi)鎖,降低并發(fā)處理能力。
          我之前的文章曾經(jīng)介紹過(guò)用JAVA實(shí)現(xiàn)同步控制,降低ORACLE隔離級(jí)別,只利用ORACLE的原子性支持。這樣做的原因就在上文中基本提到了。我們?cè)诰帉慗AVA業(yè)務(wù)邏輯時(shí),是知道我們需要在一串業(yè)務(wù)邏輯中操作多少次數(shù)據(jù)庫(kù)的,也因此,能夠在業(yè)務(wù)邏輯開(kāi)始時(shí)就控制得到所有的鎖再執(zhí)行。這樣做確實(shí)能夠降低oracle壓力,并消除死鎖問(wèn)題,然而這樣做會(huì)導(dǎo)致同步壓力集中到JAVA應(yīng)用端,而且對(duì)研發(fā)人員要求也會(huì)提高。盡管如此,在JAVA應(yīng)用端使用同步要靈活很多,而不必限制在表鎖行鎖,你甚至可以建一個(gè)森林結(jié)構(gòu)的信號(hào)量數(shù)據(jù)來(lái)控制同步。
          呵呵,反過(guò)來(lái)也可以理解隔離級(jí)別的問(wèn)題,為什么要存在允許幻像讀的隔離級(jí)別呢?隔離級(jí)別的存在是一種權(quán)衡,如果應(yīng)用既不想自己控制并發(fā),又想提高并發(fā)能力,則需要好好權(quán)衡一下吧!

          Feedback

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)  回復(fù)  更多評(píng)論   

          2008-06-13 12:43 by 小武
          學(xué)習(xí)了

          http://www.laoge.info 

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)  回復(fù)  更多評(píng)論   

          2008-06-13 12:56 by ~上善若水~
          傳智播客 & ajax全套獨(dú)家發(fā)布

          1.ajax 入門

          2.ajax 原理

          3.ajax 簡(jiǎn)單實(shí)例

          4.ajax 無(wú)限級(jí)聯(lián)動(dòng)菜單

          5.ajax 簡(jiǎn)易聊天室

          6.ajax 開(kāi)源框架簡(jiǎn)介

          7.DWR 框架源碼分析一

          8.DWR 框架源碼分析二

          9.DWR 框架源碼分析三

          10.DWR 框架源碼分析四

          11.DWR框架源碼分析五

          12.SSH + DWR完成商城驅(qū)動(dòng)

          13. Extjs 簡(jiǎn)介

          14 Extjs  簡(jiǎn)單實(shí)例

          15.SSH + Extjs 開(kāi)發(fā)系列之OA一

          16. SSH + Extjs 開(kāi)發(fā)系列之OA二

          17. SSH + Extjs 開(kāi)發(fā)系列之OA三

          18. SSH + Extjs 開(kāi)發(fā)系列之OA四

          19 .SSH + Extjs 開(kāi)發(fā)系列之OA五

          20. SSH + Extjs 開(kāi)發(fā)系列之OA六

          21. SSH + Extjs 開(kāi)發(fā)系列之OA七

          22. SSH + Extjs 開(kāi)發(fā)系列之OA八

          23.SSH + Extjs 開(kāi)發(fā)系列之OA九

          24.SSH + Extjs 開(kāi)發(fā)系列之OA十

          25. ajax 前景之我見(jiàn)

          下載地址:http://www.ibeifeng.com/read.php?tid=2338&u=5043

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)  回復(fù)  更多評(píng)論   

          2008-06-13 15:48 by ~上善若水~
          傳智播客ajax全套內(nèi)部視頻獨(dú)家發(fā)布,免費(fèi)下載

          1.ajax 入門

          2.ajax 原理

          3.ajax 簡(jiǎn)單實(shí)例

          4.ajax 無(wú)限級(jí)聯(lián)動(dòng)菜單

          5.ajax 簡(jiǎn)易聊天室

          6.ajax 開(kāi)源框架簡(jiǎn)介

          7.DWR 框架源碼分析一

          8.DWR 框架源碼分析二

          9.DWR 框架源碼分析三

          10.DWR 框架源碼分析四

          11.DWR框架源碼分析五

          12.SSH + DWR完成商城驅(qū)動(dòng)

          13. Extjs 簡(jiǎn)介

          14 Extjs  簡(jiǎn)單實(shí)例

          15.SSH + Extjs 開(kāi)發(fā)系列之OA一

          16. SSH + Extjs 開(kāi)發(fā)系列之OA二

          17. SSH + Extjs 開(kāi)發(fā)系列之OA三

          18. SSH + Extjs 開(kāi)發(fā)系列之OA四

          19 .SSH + Extjs 開(kāi)發(fā)系列之OA五

          20. SSH + Extjs 開(kāi)發(fā)系列之OA六

          21. SSH + Extjs 開(kāi)發(fā)系列之OA七

          22. SSH + Extjs 開(kāi)發(fā)系列之OA八

          23.SSH + Extjs 開(kāi)發(fā)系列之OA九

          24.SSH + Extjs 開(kāi)發(fā)系列之OA十

          25. ajax 前景之我見(jiàn)

          下載地址:http://www.ibeifeng.com/read.php?tid=2338&u=5043

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2008-06-13 17:29 by Brian
          請(qǐng)教文中說(shuō)提到的"語(yǔ)句級(jí)別上可以認(rèn)為是序列執(zhí)行的"是不是可以理解為"事務(wù)是序列執(zhí)行的"?謝謝!

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)  回復(fù)  更多評(píng)論   

          2008-06-15 11:06 by 長(zhǎng)江三峽
          高深

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)  回復(fù)  更多評(píng)論   

          2008-06-16 10:50 by 英雄
          @Brian
          語(yǔ)句級(jí)序列執(zhí)行的說(shuō)法就是區(qū)別事務(wù)級(jí)序列執(zhí)行。前者指語(yǔ)句間不會(huì)并發(fā)影響。比如一條update ** where **的語(yǔ)句可能要根據(jù)where條件更新幾萬(wàn)行數(shù)據(jù),在執(zhí)行過(guò)程中,可以認(rèn)為沒(méi)有其他語(yǔ)句在執(zhí)行。實(shí)際上則是可有并發(fā)執(zhí)行的語(yǔ)句,但是這些允許并發(fā)執(zhí)行的語(yǔ)句一定不會(huì)影響這條語(yǔ)句的執(zhí)行,比如導(dǎo)致該語(yǔ)句的where條件針對(duì)的數(shù)據(jù)在執(zhí)行過(guò)程中發(fā)生變化。后者指事物間不會(huì)并發(fā)影響。即每一組語(yǔ)句的執(zhí)行是順序執(zhí)行的,而不認(rèn)為是并發(fā)執(zhí)行的。

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)  回復(fù)  更多評(píng)論   

          2008-07-31 22:17 by karbo
          【如果沒(méi)有事務(wù)概念,oracle在語(yǔ)句級(jí)上控制并發(fā),完全不會(huì)出現(xiàn)死鎖問(wèn)題】覺(jué)得樓上的這句話有點(diǎn)問(wèn)題,不是,是有大問(wèn)題。恰恰相反,如果真的遵循事務(wù)的概念將不會(huì)產(chǎn)生死鎖,正是因?yàn)楸緛?lái)應(yīng)該作為一個(gè)事務(wù)處理的邏輯,現(xiàn)在卻要與其它邏輯并行處理才會(huì)產(chǎn)生死鎖,因而,死鎖的根本原因是并行處理。

          # re: oracle事務(wù)管理相關(guān)問(wèn)題總結(jié)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2008-08-12 13:19 by 英雄
          @karbo
          死鎖肯定要并行處理才會(huì)產(chǎn)生。但這里是指由于事務(wù)是包含多個(gè)執(zhí)行語(yǔ)句的,oracle在執(zhí)行過(guò)程中,是逐個(gè)按語(yǔ)句加鎖的;因?yàn)槭侵饌€(gè),而不是在事務(wù)一開(kāi)始就加所有的鎖,這就有可能和其他并發(fā)的事務(wù)處理產(chǎn)生死鎖。

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 合肥市| 萝北县| 平塘县| 雅安市| 高密市| 馆陶县| 湖北省| 吴旗县| 乌海市| 抚顺市| 义马市| 黄石市| 海南省| 勐海县| 阳江市| 临朐县| 谷城县| 乐安县| 湖口县| 宁波市| 马边| 伽师县| 江永县| 安国市| 赣榆县| 博罗县| 中牟县| 汉阴县| 延川县| 景德镇市| 太谷县| 桂阳县| 临漳县| 铜鼓县| 临湘市| 钦州市| 宜宾县| 思茅市| 墨竹工卡县| 长寿区| 南木林县|