Oracle LOCK TABLE語句(鎖表)


Oracle LOCK TABLE語句(鎖表)

 

在 Oracle 中,LOCK TABLE 語句可以用來鎖定表、表分區或表子分區。本教程將和大家一起學習 LOCK TABLE 語句的詳細用法。

LOCK TABLE語法

LOCK TABLE 語句的語法是:

LOCK TABLE tables IN lock_mode MODE [ WAIT [, integer] | NOWAIT ];

參數

  • tables:用逗號分隔的表格列表。
  • lock_mode:它是以下值之一:
                                               lock_mode                                                       描述
ROW SHARE 允許同時訪問表,但阻止用戶鎖定整個表以進行獨占訪問。
ROW EXCLUSIVE 允許對表進行並發訪問,但阻止用戶以獨占訪問方式鎖定整個表並以共享方式鎖定表。
SHARE UPDATE 允許同時訪問表,但阻止用戶鎖定整個表以進行獨占訪問。
SHARE 允許並發查詢,但用戶無法更新鎖定的表。
SHARE ROW EXCLUSIVE 用戶可以查看表中的記錄,但是無法更新表或鎖定SHARE表中的表。
EXCLUSIVE 允許查詢鎖定的表格,但不能進行其他活動。
  • WAIT:它指定數據庫將等待(達到指定整數的特定秒數)以獲取 DML 鎖定。
  • NOWAIT:它指定數據庫不應該等待釋放鎖。

LOCK TABLE示例

下面是一個如何在 Oracle 中使用 LOCK TABLE 語句的例子:

LOCK TABLE suppliers IN SHARE MODE NOWAIT;

這個例子會鎖定 suppliers 表在共享模式,而不是等待鎖定被釋放。

Oracle中的鎖定可以分為幾類:
1、DML lock(data lock),
2、DDL lock(dictionary lock)
3、internal lock/latch。

DML lock又可以分為row lock和table lock。row lock在select.. for update/insert/update/delete時隱式自動產生,而table lock除了隱式產生,也可以調用lock table <table_name> in </table_name> name來顯示鎖定。

如果不希望別的session lock/insert/update/delete表中任意一行,只允許查詢,可以用lock table table_name in exclusive mode。(X)這個鎖定模式級別最高,並發度最小。

如果允許別的session查詢或用select for update鎖定記錄,不允許insert/update/delete,可以用
lock table table_name in share row exclusive mode。(SRX)

如果允許別的session查詢或select for update以及lock table table_name in share mode,只是不允許insert/update/delete,可以用
lock table table_name in share mode。(share mode和share row exclusive mode的區別在於一個是非搶占式的而另一個是搶占式的。進入share row exclusive mode后其他session不能阻止你insert/update/delete,而進入share mode后其他session也同樣可以進入share mode,進而阻止你對表的修改。(S)

還有兩種鎖定模式,row share(RS)和row exclusive(RX)。他們允許的並發操作更多,一般直接用DML語句自動獲得,而不用lock語句。
詳細參考concepts文檔中的"Type Of Locks":
http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937 


-------------------------------------
怎么unlock table 解鎖

方法一、kill session:

SQL> select object_id,session_id from v$locked_object;  //注意session_id 就是上鎖的 session標志
SQL> select username,sid,SERIAL#  from v$session where sid=。。;      //這里的SID = session_id 
SQL> alter system kill session 'id,serial#';     //殺死該session

方法二、rollback/commit 終止事務處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM