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 獲取詳細信息。