Oracle開發技術:OracleSkipLocked
Oracle開發技術:OracleSkipLocked
Oracle Skip Locked
[html]
Oracle Skip Locked
Oracle 11g引入skip locked。
Skip Locked 是在query select語句中跳過已經被其他正在執行的query select語句鎖住的行,只執行能夠獲得鎖的行。
select for update如何查詢大數量,那么其他session同時執行的select語句可能會等待鎖超時而報下面這個錯
ORA-30006: resource busy; acquire with WAIT timeout expired
如果是不超時的case,那么會出現
ORA-00054 resource busy and NOWAIT specified
比如session1執行下面語句:
SELECT *
FROM dept WHERE
deptno = 10
FOR UPDATE NOWAIT;
輸出:
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
session2執行下面語句:
SELECT * FROM dept
WHERE deptno IN (10,20)
FOR UPDATE NOWAIT;
那么輸出:
SELECT * FROM dept WHERE deptno IN (10,20)
FOR UPDATE NOWAIT
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
因為session1已經鎖住10這一行,session2請求獲得不到10這一行的鎖,就報錯了。
那么在session2我們可以使用skip locked
SELECT * FROM dept
WHERE deptno IN (10,20)
FOR UPDATE SKIP LOCKED;
此時輸出:
DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH DALLAS
SKIP LOCKED會跳過被鎖住的行,只查詢沒有鎖住的行。