Oracle鎖機制的總結【轉】

??最近在研究Oracle鎖機制的時候發現網上的資料魚龍混雜將,很多將問題復雜化,讓人感覺沒有條理性。經過查詢原始理論資料,總結如下:

???????? 在數據庫理論中,我們知道。我們在執行并發訪問數據庫表時,如果沒有任何一致性控制措施,那么會出現以下幾種數據不一致的情況:1)提交被覆蓋;2)不可重復讀(其中包括了幻讀);3)讀“臟數據”。經過仔細分析,發現引起這些情況的根本原因是:在對數據庫公共資源訪問時,出現了事務交叉的情況。因此,在數據庫的理論里有“可串行化”這種衡量標準,就是說:如果我們在并發情況下通過對并發事務的控制得到的最終結果和我們按順序一個個執行事務是一樣的結果,那么我們就認為這種控制是“可串行化”的,是正確的。

????????? 鎖機制是當前解決這些問題的最有效的辦法,以下的兩個概念“基本鎖”和“意向鎖”是最基本的兩個概念,是構成所有其他鎖的基礎。
????????? 1)為了在并發性和一致性這對矛盾中合理取舍,提供了兩種最基本的鎖:共享鎖(讀鎖)、排它鎖(寫鎖)。
?????????共享鎖(S):如果事務T對表A加上共享鎖,則事務T可以讀該表,但是不能修改該表數據。其他事務也只能對該對象加上共享鎖,但是不能加上排他鎖。這就保證了其他事務可以讀A表數據,但是不能修改A表數據(這就不會影響到讀該表的事務了,有利于并發操作)。
???????? 排他鎖(X):如果事務T對對象A加上排他鎖,則只允許T對A對象讀取和修改,其他事務不能對A增加任何鎖,只到T釋放加載A上的排他鎖。
???????? 那么如何使用這些鎖解決問題呢?數據庫的基本理論提出了三種級別的封鎖協議,封的越高,控制的范圍越大,一致性也越好,并發性也越差。具體的大家可以查資料,也很簡單,這里為了節約篇幅不再敘述。
????????? 2)可是動輒就給整個表加鎖,這有點魯莽草率。我們知道,在一個并發的環境下,我們的程序(事務)操作的常常并不是表中的同一樣數據,而這樣大范圍的控制表數據很顯然不利于并發,那么我們可以針對需要縮小控制范圍,于是提出了“多粒度封鎖”的概念。也就是說,程序(事務)既可以封鎖整個表,也可以只封鎖某些和我們有關的行,這樣就不會影響其他程序(事務)到該表中其他的行。可是新的問題又來了,我們如果要對某個表進行某種操作,比如刪除整個表的數據,那么數據庫程序就要遍歷整個表的每個行,這很顯然過于消耗資源,那咋辦?于是,“意向鎖”應運而生。意向鎖的概念基本上是這個意思:如果我們要封鎖表的某個行,則也在該行所在的表上加上鎖。這樣的話在對整個表進行操作時,就不用遍歷表里的所有行了。通過和前邊提到的共享鎖和排他鎖,我們組合出三種鎖:
?????????? 意向共享鎖(IS):如果我們對表加IS鎖,表示該表中的某個行被加上了S鎖。
?????????? 意向排他鎖(IX):如果我們對表加IX鎖,表時該表中的某個行上被加上X鎖。
?????????? 共享意向排他鎖(ISX)。表示先對某個表加上S鎖,然后再加上X鎖,表示要讀取整個表的數據,但是只對其中的一部分行做修改。

????????那么最終一共得到5種鎖:共享鎖(S)、排他鎖(T)、意向共享鎖(IS)、意向排他鎖(IX)、共享意向排他鎖(SIX)。

??????? 好,談完理論,我們和具體的數據庫Oracle結合起來,Oracle一共提供了共享鎖(S)、排他鎖(T)、行級共享鎖(RS)、行級排他鎖(RX)、共享行級排他鎖(SRX)。和上一句話一對比,我們就知道了,它們是一一對應的。可是,Oracle作為一個成功的數據庫,總是有自己別出心裁的地方。可能Oracle認為讀數據的時候加鎖這種機制,在很大程度上是浪費,比如用戶修改的數據大多數是自己的不會影響到別的用戶(只局限于某些行,不會影響其他行)。所以,默認情況下,Oracle在讀取表中數據的時候并沒有加鎖,而是采用了回滾段的策略解決了這個問題,具體的原理在稍后再說。這樣的確是提高了并發性,但是我認為,這其實也是種冒險行為,一旦出現用戶B必須要讀取用戶A的數據,而且要參考讀取的結果進行一些重要的操作時,這個時候就需要我們自己手動去加鎖了(Oracle的確提供了這種功能,讓我們自己用語句去加鎖)。下邊,我們詳細談下Oracle自己鎖的具體行為:
??????? 共享鎖:通過lock table in share mode命令添加該S鎖。在該鎖定模式下,不允許任何用戶更新表。但是允許其他用戶發出select …from for update命令對表添加RS鎖。
??????? 排他鎖:通過lock table in exclusive mode命令添加X鎖。在該鎖定模式下,其他用戶不能對表進行任何的DML和DDL操作,該表上只能進行查詢。
??????? 行級共享鎖:通常是通過select … from for update語句添加的,同時該方法也是我們用來手工鎖定某些記錄的主要方法。比如,當我們在查詢某些記錄的過程中,不希望其他用戶對查詢的記錄進行更新操作,則可以發出這樣的語句。當數據使用完畢以后,直接發出rollback命令將鎖定解除。當表上添加了RS鎖定以后,不允許其他事務對相同的表添加排他鎖,但是允許其他的事務通過DML語句或lock命令鎖定相同表里的其他數據行。
?????? 行級排他鎖:當我們進行DML時會自動在被更新的表上添加RX鎖,或者也可以通過執行lock命令顯式的在表上添加RX鎖。在該鎖定模式下,允許其他的事務通過DML語句修改相同表里的其他數據行,或通過lock命令對相同表添加RX鎖定,但是不允許其他事務對相同的表添加排他鎖(X鎖)。
?????? 共享行級排他鎖:通過lock table in share row exclusive mode命令添加SRX鎖。該鎖定模式比行級排他鎖和共享鎖的級別都要高,這時不能對相同的表進行DML操作,也不能添加共享鎖。

??????? 好了,引用別人的一個例子來描述Oracle如何通過回滾段來解決重復讀和幻讀的問題:
??????? 如果有一個事務A執行以下語句:update employees set last_name='HanSijie'? where employee_id=100;如果當前有一個用戶(假設為B)發出SQL語句,檢索employee_id為100的記錄信息,這時服務器進程發現被檢索的記錄有鎖定標記,說明當前該記錄已經被其他用戶修改了,但是還沒提交。于是根據數據行頭部記錄的ITL槽的槽號,在數據塊頭部找到該ITL槽,并根據其中記錄的undo數據塊的地址,找到該undo 數據塊,將其中所保存的改變前的舊值取出,并據此構建CR(Consistent Read一致性讀)塊,該CR塊中的數據就是被更新的數據塊(也就是58號數據塊)在更新前的內容。于是根據該CR塊的內容,將用戶所需要的信息返回給C。
??????? 以上的例子,可以證明之前我所說的擔心的地方,也就是說,假如我們這個用戶B要參照這個數據來決定下一步程序重要的走向,那么我們在做這件事情的時候,必須也要對該記錄加鎖,因為Oracle并沒有對我們的讀取采取加鎖的行為。我們必須要控制我們在做下一步動作前的這個“決定因素”不能被別人修改。

??????? 另外,還有一點總結,由于我沒有深入研究過多線程編程,只是在研究Struts2時,對Struts2處理Action的多線程問題時研究了下ThreadLocal模式。得出以下總結,可能不完善。個人認為,資源分為兩種,一種是:多個線程必須交互的資源,比如表中的數據,再比如必須參考的某個成員變量。還有一種是:多線程可以不用交互的資源,比如我們Struts2中的成員變量。第一種情況,相當于是個十字路口,在不允許“修天橋”的情況下,多個線程必須要走這個交叉點。第二種情況是,可以通過“修天橋”來避免在同一個空間里的沖突。ThreadLocal就是基于這種思想,是為了降低線程沖突,也是為了節約資源等待的時間,本質上是計算機中的真理“空間換時間”。

??????? 以上內容有很多借鑒了數據庫基本理論,但是將抽象的對象具體到表和表中的行,這樣有助于理解。主要是為了澄清一些概念,比如有人將“幻讀”單獨作為一種不一致情況,而省去了“提交被覆蓋”這種情況。我個人認為,很顯然,幻讀只是不可重復讀的一種情況(幻讀強調的是集合)。中間也摘錄了其他人文章中的部分內容。如果中間有錯誤,希望留言評論。

轉載于:https://www.cnblogs.com/hsz1124/p/7409981.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371430.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2020暨陽學院園林計算機考研考場,【圖片】2020考研,老學長教你如何規劃!【計算機考研吧】_百度貼吧...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓二、關鍵一步——院校選擇我把各位同學的院校選擇階段分為以上幾個階段,因為考研這一年中,很多人的目標院校并不是固定不變的,而是隨著不同階段而改變的。學長我在大三下學期這一時間段內也多次更…

List Box 控件

1 //定義變量,并關聯控件與變量。IDC_RecvData為控件ID,recvData為控件對應的變量名 2 CListBox recvData; 3 4 DDX_Control(pDX, IDC_RecvData, recvData); 5 6 //向List Box控件IDC_RecvData中添加一行數據 7 CString str; 8 recvData.Ad…

JavaOne 2012:向上,向上和向外:使用Akka擴展軟件

在最后的社區主題演講后,我前往希爾頓金門大橋3/4/5觀看了維克多巴生 ( Viktor Klang )的( Typesafe )“上,下,外:Akka”演講。 巴生(Klang)是Akka的技術主管…

華北科技學院計算機期末考試,華北科技學院 專業計算機 考試專用

1不能應用修剪命令“trim”進行修剪的對象是(D、文字) 。2. 命令行(B.不能隨意移動)3. 布爾運算中差集的熱鍵為(A.SU)4. 定距等分點用( C.DIST)命令5. 標高是以( B.厘米) 為單位6. 在建筑平面圖中用以指明朝向的是( B.指北針)7. A3圖紙的尺寸是( c.420x297)8. 既可以繪制直線&a…

redux-plain-english-workflow

https://quickleft.com/blog/redux-plain-english-workflow/轉載于:https://www.cnblogs.com/skating/p/6495384.html

Spring測試支持和上下文緩存

Spring為單元測試和集成測試提供了全面的支持-通過注釋來加載Spring應用程序上下文,并與JUnit和TestNG等單元測試框架集成。 由于為每個測試加載大型應用程序上下文需要時間,因此Spring智能地為測試套件緩存應用程序上下文–通常,當我們通過a…

perl6正則 4: before / after 代碼斷言: ?{} / !{}

<?before> <? befor XXX> 某字符在 xxx 之前 <?after > <?after XXX> 某字符之后有XXX 對應的取反分別為: <!before > <!before XXX> XXX之前沒有 <!after> <!after xxx> 某字符后面不是 xxx say "foobar" ~~…

mac 下JDK 與 tomcat 的安裝與配置

一.Mac下JDK的安裝 1.先檢測Mac是否已經安裝過JDK&#xff0c;在終端中輸入java 或者 javac 顯示說明&#xff0c;表明已經安裝過JDK&#xff0c;JDK版本查詢終端鍵入java &#xff0d;version&#xff0c;終端會返回JDK的版本號。 2.如果沒有安裝JDK&#xff0c;登陸 http://w…

新型發明創造大賽計算機類,2017年發明杯全國高職高專大學生創新創業大賽

以“發明創新實現夢想、創意創業改變生活”主題活動為依托&#xff0c;把課內與課外教育相結合&#xff0c;學校教育、家庭教育與社會教育相結合&#xff0c;培養廣大在校大學生的科技創新意識和實踐動手能力&#xff0c;激發他們設計創造的樂趣&#xff0c;使廣大大學生大膽創…

如何寫出安全的API接口(參數加密+超時處理+私鑰驗證+Https)- 續(附demo)

轉載&#xff1a;http://www.cnblogs.com/codeon/p/6123863.html 上篇文章說到接口安全的設計思路&#xff0c;如果沒有看到上篇博客&#xff0c;建議看完再來看這個。 通過園友們的討論&#xff0c;以及我自己查了些資料&#xff0c;然后對接口安全做一個相對完善的總結&#…

PrimeFaces在GlassFish 3.1.2.2上推動大氣

PrimeFaces 3.4在三天前問世。 除了通常令人敬畏的新組件和更新組件之外&#xff0c;它還包括新的PrimeFaces Push框架。 基于Atmosphere&#xff0c;這為您的應用程序提供了簡單的推送機制。 這是在最新的GlassFish 3.1.2.2上配置和運行它的方法。 準備工作 像往常一樣&#…

部分視圖跳轉

var album GetDailyDeal(); return PartialView("_DailyDeal", album); 通過NuGet需要添加microsoft.jquery.unobtrusive.ajax 方法一 在BundleConfig.cs 里添加 bundles.Add(new ScriptBundle("~/bundles/jqueryajax").Include("~/Scripts/jquery…

計算機二級目錄設置,word2設置標題格式,生成目錄,奇偶頁設置等等,適用考計算機二級辦公軟件,也適用于畢業論文格式設置...

word2設置標題格式,生成目錄,奇偶頁設置等等,適用考計算機二級辦公軟件,也適用于畢業論文格式設置 這是第2部分word資料 , 跟之前的第一部份word資料合為一份第二題2、在正文前按序插入節&#xff0c;使用“引用”中的目錄功能&#xff0c;生成如下內容&#xff1a;(1) 第1節&a…

JBoss AS 7類加載說明

這是示例章節&#xff0c;摘自Francesco Marchioni編輯的JBoss AS 7 Configuration Deployment and Administration一書&#xff0c;該書正在運行一個名為mastertheboss.com的JBoss門戶。 根據Java EE規范的要求&#xff0c;理想情況下&#xff0c;應用程序服務器應為其部署的應…

打印機 共享 問題

1 用戶提報無法打印&#xff0c;經查被共享打印機無法聯網&#xff0c;先檢查網線是否正常&#xff08;換其他電腦是否能行&#xff09;&#xff0c;再檢查交換機是否正常&#xff0c;經查交換機需要重啟&#xff0c;然后解決問題。 2 被共享機器為32位操作系統&#xff0c;其余…

CoordinatorLayout 中ToolBar遮擋RecyclerView的內容

解決方法:在RecyclerView中添加 app:layout_behavior"string/appbar_scrolling_view_behavior"參考資料:http://stackoverflow.com/questions/32855889/content-behind-coordinatorlayout-appbarlayout 轉載于:https://www.cnblogs.com/niluogege/p/6511094.html

兵團職稱計算機準考證查詢,兵團初級會計準考證打印入口官網

兵團初級會計準考證打印入口官網為財政部會計資格評價中心網(http://kzp.mof.gov.cn)。準考證打印時間在4月16日前公布&#xff0c;考生需要在規定時間登錄財政部會計資格評價中心網(http://kzp.mof.gov.cn)下載并打印準考證。未在上述時限內下載打印準考證的&#xff0c;視作放…

用于集成測試的Maven Cargo插件

在項目生命周期中&#xff0c;非常普遍的需求是設置集成測試。 幸運的是&#xff0c;Maven具有針對此確切方案的內置支持&#xff0c;具有默認構建生命周期的以下階段&#xff08;來自Maven 文檔 &#xff09;&#xff1a; 集成前測試 &#xff1a; 執行集成測試之前所需的操作…

jquery-文檔操作

1.text() 設置或返回元素的text值 <div id"divname">old text</div> $(#divname).text("new text"); 將改變顯示的old為new [1] 參考w3scholl文檔操作 轉載于:https://www.cnblogs.com/hellokittyblog/p/9128397.html

bzoj 4259: 殘缺的字符串

這題好神啊&#xff0c;居然是fft&#xff0c;表示一直在往數據結構上想。 把*當成0&#xff0c;那么兩個串可以匹配當且僅當$$\sum (a[i]-b[i])^2\times a[i]\times b[i]0$$ 我們可以把平方拆開&#xff0c;然后就變成了幾個乘積相加的形式&#xff0c;那就大力翻轉一個串然后…