Ordinary hut

          人間一福地,勝似天仙宮
          posts - 61, comments - 50, trackbacks - 0, articles - 1

          oracle的鎖和事務(wù)的記錄

          Posted on 2010-02-19 22:23 landor 閱讀(1524) 評論(0)  編輯  收藏 所屬分類: oracle
          oracle的鎖并沒有鎖升級,也就是無論有多少行數(shù)據(jù)被鎖定也不會升級到表鎖,這和sqlserver完全不一樣

          oracle鎖類型包括:DML鎖、DDL鎖、內(nèi)部鎖和閂
          DML鎖:數(shù)據(jù)庫操作語言鎖,比如insert、delete、update語句引發(fā)的鎖。當(dāng)進(jìn)行上述操作時,會出現(xiàn)兩種DML鎖:
              TX鎖:事務(wù)鎖,當(dāng)事務(wù)發(fā)起第一次修改時會出現(xiàn)TX鎖,直到事務(wù)的提交或回滾時釋放鎖,當(dāng)執(zhí)行select for update的時候也會引發(fā);
              TM鎖:當(dāng)數(shù)據(jù)被修改時,為防止出現(xiàn)表結(jié)構(gòu)的變化,比如alter、drop操作,所加的鎖,這時如果有其他事務(wù)修改表結(jié)構(gòu),會返回錯誤信息ORA-00054。

          TX鎖:當(dāng)修改表中某一行或者某十行數(shù)據(jù)時,會在包含該數(shù)據(jù)的塊中記錄當(dāng)前事務(wù)的id。此時如果另會話2進(jìn)入,要修改當(dāng)前記錄時,會檢查當(dāng)前塊中的事務(wù)id,然后到事務(wù)表中查看該事務(wù)是否活動,如果不活動,那么會話2會修改該行并鎖定該行;如果活動那么會話2會發(fā)出一個request,要求會話1釋放鎖的時候通知會話2一聲。

              這里涉及到了3個表:V$TRANSACTION(事務(wù)表),V$SESSION(會話表)、V$LOCK(鎖信息)
              這里記錄一下V$LOCK表,這里面的記錄是針對表和會話的,而不是針對行的,如果表有1條記錄被鎖定,那么V$LOCK中會有一條記錄,如果表中有10條記錄被鎖定,那么V$LOCK中還是一條,因為它是針對于會話的。
              在表V$LOCK的SID就是會話id,而通過id1和id2可以匹配到V$TRANSACTION中的事務(wù)id

              舉個例子:如果事務(wù)1鎖定了一個表的10行記錄,那么V$LOCK中會有一條記錄,其中LMODE為6,表示排他鎖,REQUEST為0,表示事務(wù)1并沒有發(fā)出請求,也就是說事務(wù)1可以擁有這個鎖;
              此時事務(wù)2也要鎖定這10行記錄中的若干行,結(jié)果發(fā)現(xiàn)該行已經(jīng)被事務(wù)1鎖住了,事務(wù)2只能向事務(wù)1發(fā)出請求REQUEST=6,意思是事務(wù)2向事務(wù)1發(fā)出一個排他鎖的請求,此時在V$LOCK表中有三條記錄,一條是事務(wù)2的排他鎖,一條是事務(wù)2向事務(wù)1發(fā)出的request請求,一條是事務(wù)1的排他鎖。當(dāng)事務(wù)1提交或者回滾釋放鎖后,V$LOCK中事務(wù)2的那個請求行消失,事務(wù)2獲取了該行的排他鎖。

          DDL鎖:數(shù)據(jù)庫定義語言鎖,當(dāng)進(jìn)行表的alter等操作時,會觸發(fā)該鎖,防止其他會話(session)獲取到這個表的DDL鎖或者DML鎖中的TM鎖。
              DDL語句是總是提交的,比如有3個alter語句,那么每個都是自動提交的,比如第二個出現(xiàn)錯誤,那么第一個也已經(jīng)提交了,無法回滾了




          關(guān)于oracle的事務(wù)處理

          ACID是下面的4個詞:

          原子性:事務(wù)中的所有動作要么都發(fā)生,要么都不發(fā)生
          一致性:事務(wù)將數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換為另一種狀態(tài)
          隔離性:一個事務(wù)的影響在該事務(wù)提交前,對其他事務(wù)是不可見的
          持久性:事務(wù)一旦提交,其影響的結(jié)果是永久的

          分布式事務(wù):

          oracle使用了一個協(xié)議,叫2pc協(xié)議(兩階段提交two-phase commit),如果同時修改多個數(shù)據(jù)庫,那么其中一個數(shù)據(jù)庫(比如數(shù)據(jù)庫1)會成為事務(wù)的發(fā)起者和協(xié)調(diào)者,具體操作如下:
              1 數(shù)據(jù)庫1會詢問其他所有數(shù)據(jù)庫的事務(wù)是否已經(jīng)準(zhǔn)備完畢了
              2 數(shù)據(jù)庫2和數(shù)據(jù)庫3分別報告說已經(jīng)ok了
              3 數(shù)據(jù)庫1會廣播一條信息,讓所有數(shù)據(jù)庫都知道其他數(shù)據(jù)庫的事務(wù)已經(jīng)ok了,可以提交自己的事務(wù)了

              如果有一個數(shù)據(jù)庫報告的是no,那么事務(wù)1會發(fā)出消息,讓所有事務(wù)回滾

              如果在數(shù)據(jù)庫2和3都返回ok的時候,數(shù)據(jù)庫1馬上要廣播給其他數(shù)據(jù)庫,結(jié)果發(fā)生掉電等問題了,那么數(shù)據(jù)庫2和數(shù)據(jù)庫3的事務(wù)都會掛起等待事務(wù)1的消息,此時就會出現(xiàn)可疑事務(wù),這種事務(wù)就需要人工處理了。



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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 临洮县| 齐河县| 腾冲县| 海城市| 灵武市| 普兰县| 宁阳县| 通化县| 资溪县| 乐山市| 温泉县| 玉龙| 舒城县| 峡江县| 彭山县| 大邑县| 灵武市| 博罗县| 合江县| 孟州市| 嘉鱼县| 南昌市| 额济纳旗| 五指山市| 广饶县| 丰原市| 手机| 祁东县| 成安县| 海口市| 定兴县| 修武县| 山东| 吉林市| 江陵县| 钟山县| 六枝特区| 彰化县| 泽州县| 贵溪市| 章丘市|