Oracle鎖表 行級鎖 表級鎖 行級鎖

Oracle鎖表  行級鎖  表級鎖   spa

        ---- 行被排他鎖定  對象

        ----在某行的鎖被釋放以前,其餘用戶不能修改此行          ----使用 commit 或 rollback 命令釋放鎖  事務

        ----Oracle 經過使用 INSERT、UPDATE 和 SELECT…FOR UPDATE 語句自動獲取行級鎖  it

SELECT…FOR UPDATE 子句  ―在表的一行或多行上放置排他鎖  ―用於防止其餘用戶更新該行  table

―能夠執行除更新以外的其餘操做  變量

―select * from goods where gid=1001  ―for update of gname;  兼容性

―只有該用戶提交事務,其餘用戶纔可以更新gname   擴展

FOR UPDATE WAIT 子句  ―Oracle9i 中的新增功能  ―防止無限期地等待鎖定的行  ―等待間隔必須指定爲數值文字  date

―等待間隔不能是表達式、賦值變量或 PL/SQL  變量  select

―select * from goods where gid=1001 for update of gname wait        3  ―等待用戶釋放更新鎖的時間爲3秒,不然超時。  •表級鎖  

―保護表的數據  

―在多個用戶同時訪問數據時確保數據的完整性  ―能夠設置爲三種模式:共享、共享更新和 排他  

          語法:lock table <table_name>in <mode>;  共享鎖  ―鎖定表  

―僅容許其餘用戶執行查詢操做  ―不能插入、更新和刪除  

―多個用戶能夠同時在同一表中放置此鎖  ―lock table table_name  ―in share mode [nowait];  

― rollback 和commit 命令釋放鎖  ― nowait 關鍵字告訴其餘用戶不用等待  共享更新鎖  

―鎖定要被更新的行  

―容許其餘用戶同時查詢、插入、更新未被鎖定的行  

―在 SELECT 語句中使用「FOR UPDATE」子句,能夠強制使用共享更新鎖  ―容許多個用戶同時鎖定表的不一樣行

加鎖的兩種方法  

            lock table tab_name in share update mode;              select column1,column2              from goods              where goods              where gid=1001  

            for update of column1,column2  排他鎖  

―與其餘兩種鎖相比,排他鎖是限制性最強的表鎖  ―僅容許其餘用戶查詢數據  

―不容許執行插入、刪除和更新操做  

―在同一時間僅容許一位用戶在表上放置排他鎖  ―共享鎖與此相反   

        lock table tab_name in exclusive mode;          lock table <表名>[ <表名>]...                    in share mode [nowait]     

        lock table < 表名>[ <表名>]...          in exclusive mode [nowait]          lock table <表名>[ <表名>]...          in share update mode[nowait]                       

-----------------------------------------------------------------------------------------------

LOCK      Name    

  LOCK   —   在事務中明確地鎖定一個表        LOCK   [   TABLE   ]   name    

  LOCK   [   TABLE   ]   name   IN   [   ROW   |   ACCESS   ]   {   SHARE   |   EXCLUSIVE   }   MODE    

  LOCK   [   TABLE   ]   name   IN   SHARE   ROW   EXCLUSIVE   MODE          輸入                

  name    

  要鎖定的現存的表.           

  ACCESS   SHARE   MODE    

  注意:   這個鎖模式對被查詢的表自動生效。           

  這是最小限制的鎖模式,只與   ACCESS   EXCLUSIVE   模式衝突。   它用於保護被查詢的表免於被並行的   ALTER   TABLE,   DROP   TABLE   和   VACUUM   對同一表操做的語句修改。           

  ROW   SHARE   MODE    

  注意:   任何   SELECT...FOR   UPDATE   語句執行時自動生效。   由於它是一個共享鎖,之後可能更新爲   ROW   EXCLUSIVE   鎖。           

  與   EXCLUSIVE   和   ACCESS   EXCLUSIVE   鎖模式衝突。           

  ROW   EXCLUSIVE   MODE    

  注意:   任何   UPDATE,   DELETE和   INSERT   語句執行時自動生效。           

  與   SHARE,   SHARE   ROW   EXCLUSIVE,   EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式衝突。           

  SHARE   MODE    

  注意:   任何   CREATE   INDEX   語句執行時自動附加。   共享鎖住整個表.           

  與   ROW   EXCLUSIVE,SHARE   ROW   EXCLUSIVE,EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式衝突。這個模式防止一個表被並行更新。           

  SHARE   ROW   EXCLUSIVE   MODE    

  注意:   這個模式相似   EXCLUSIVE   MODE,可是容許其餘事務的   SHARE   ROW   鎖.           

-----------------------------------------------------------------------------------------------

  與   ROW   EXCLUSIVE,SHARE,SHARE   ROW   EXCLUSIVE,EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式衝突。           

  EXCLUSIVE   MODE    

  注意:   這個模式一樣比   SHARE   ROW   EXCLUSIVE   更有約束力.   它阻塞全部並行的   ROW   SHARE/SELECT...   FOR   UPDATE   查詢。           

  與   ROW   EXCLUSIVE,SHARE,SHARE   ROW   EXCLUSIVE,EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式衝突。           

  ACCESS   EXCLUSIVE   MODE    

  注意:   由語句   ALTER   TABLE,   DROP   TABLE,VACUUM   執行時自動生效。這是最嚴格的約束鎖,它與全部其餘的鎖   模式衝突而且保護一個被鎖定的表不被任何其餘並行的操做更改。           

  注意:   一個不合格的   LOCK   TABLE   一樣要求這個鎖模式   (例如,一條沒有顯式鎖模式選項的命令)。                

  輸出                

  LOCK   TABLE        成功鎖定後的返回.           

  ERROR   name:   Table   does   not   exist.        若是name   不存在,返回此信息.                

  描述      

  LOCK   TABLE   控制一次事務的生命期內對某表的並行訪問.   Postgres   在可能的狀況下儘量使用最小約束的鎖模式。   LOCK   TABLE   在你須要時提供更有約束力的鎖。           

  RDBMS   鎖定使用下面術語:                

  EXCLUSIVE    

  排它鎖,防止其餘(事務)鎖的產生.           

  SHARE    

  容許其餘(事務)共享鎖.避免   EXCLUSIVE   鎖.           

  ACCESS    

-----------------------------------------------------------------------------------------------

  鎖定表結構.           

  ROW    

  鎖定獨立的行.           

  注意:   若是沒有聲明   EXCLUSIVE   或   SHARE,假設爲   EXCLUSIVE.鎖存在於事務週期內.                

  例如,一個應用在   READ   COMMITED   隔離級別上運行事務,   而且它須要保證在表中的數據在事務的運行過程當中都存在。要實現這個你   能夠在查詢以前對錶使用   SHARE   鎖模式進行鎖定。這樣將保護數據不被   並行修改而且爲任何更進一步的對錶的讀操做提供實際狀態的數據,   由於   SHARE   鎖模式與任何寫操做須要的   ROW   EXCLUSIVE   模式衝突,而且你的   LOCK   TABLE   name   IN   SHARE   MODE   語句將等到全部並行的寫操做提交或回捲後才執行。           

  注意:   當在   SERIALIZABLE   隔離級別運行事務,並且你須要讀取真實狀態的數據時,   你必須在執行任何   DML   語句   (這時事務定義什麼樣的並行修改對它本身是可見的)   以前運行一個   LOCK   TABLE   語句。                

  除了上面的要求外,若是一個事務準備修改一個表中的數據,   那麼應該使用   SHARE   ROW   EXCLUSIVE   鎖模式以免死鎖狀況(當兩個   並行的事務試圖以   SHARE   模式鎖住表而後試圖更改表中的數據時,   兩個事務(隱含的)都須要   ROW   EXCLUSIVE   鎖模式,而此模式與並行的   SHARE   鎖衝突)。           

  繼續上面的死鎖(兩個事務彼此等待)問題,   你應該遵循兩個通用的規則以免死鎖條件:                

  事務應該以相同的順序對相同的對象請求鎖。           

  例如,若是一個應用更新行   R1   而後更新行   R2(在同一的事務裏),   那麼第二個應用若是稍後要更新行   R1   時不該該更新行   R2(在   同一事務裏)。相反,它應該與第一個應用以相同的順序更新行   R1   和   R2。           

  事務請求兩個互相沖突的鎖模式的前提:其中一個鎖模式是自衝突的   (也就是說,一次只能被一個事務持有)。   若是涉及多種鎖模式,那麼事務應該老是最早請求最嚴格的鎖模式。           

  這個規則的例子在前面的關於用   SHARE   ROW   EXCLUSIVE   模式取代   SHARE   模式的討論中已經給出了。         -----------------------------------------------------------------------------------------------

  注意:   Postgres   的確檢測死鎖,   並將回捲至少一個等待的事務以解決死鎖。           

  注意      

  LOCK   是   Postgres   語言擴展.           

  除了ACCESS   SHARE/EXCLUSIVE   鎖模式外,全部其餘   Postgres   鎖模式和   LOCK   TABLE   語句都與那些在   Oracle   裏面的兼容。           

  LOCK   只在事務內部使用.           

  用法      

  演示在往一個外鍵表上插入時在有主鍵的表上使用   SHARE   的鎖:           

  BEGIN   WORK;    

  LOCK   TABLE   films   IN   SHARE   MODE;      SELECT   id   FROM   films      

          WHERE   name   =   'Star   Wars:   Episode   I   -   The   Phantom   Menace';    

  --   若是記錄沒有返回則回捲    

  INSERT   INTO   films_user_comments   VALUES      

          (_id_,   'GREAT!   I   was   waiting   for   it   for   so   long!');      COMMIT   WORK;               

  在執行刪除操做時對一個有主鍵的表進行   SHARE   ROW   EXCLUSIVE   鎖:           

  BEGIN   WORK;    

  LOCK   TABLE   films   IN   SHARE   ROW   EXCLUSIVE   MODE;      DELETE   FROM   films_user_comments   WHERE   id   IN              (SELECT   id   FROM   films   WHERE   rating   <   5);      DELETE   FROM   films   WHERE   rating   <   5;      COMMIT   WORK;                 兼容性        SQL92      

  在SQL92裏面沒有LOCK   TABLE   ,可使用   SET   TRANSACTION   來聲明當前事務的級別.   咱們也支持這個,參閱   SET   TRANSACTION   獲取詳細信息。

相關文章
相關標籤/搜索