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 終止事務處理