sqlforupdate鎖表
⑴ pl/sql 很簡單的一句for update 一直處在執行中
查看是否已經被別人鎖表,鎖表情況下肯定做不了update
你的forupdate數據量有沒有很大,數據量很大會執行很長時間
⑵ 資料庫中Select For update語句的解析
他們已經說了相關的東西了
我再補充幾點:
分成兩類:加鎖范圍子句和加鎖行為子句
加鎖范圍子句:
在select…for update之後,可以使用of子句選擇對select的特定數據表進行加鎖操作。默認情況下,不使用of子句表示在select所有的數據表中加鎖
加鎖行為子句:
當我們進行for update的操作時,與普通select存在很大不同。一般select是不需要考慮數據是否被鎖定,最多根據多版本一致讀的特性讀取之前的版本。加入for update之後,Oracle就要求啟動一個新事務,嘗試對數據進行加鎖。如果當前已經被加鎖,默認的行為必然是block等待。使用nowait子句的作用就是避免進行等待,當發現請求加鎖資源被鎖定未釋放的時候,直接報錯返回。
在日常中,我們對for update的使用還是比較普遍的,特別是在如pl/sql developer中手工修改數據。此時只是覺得方便,而對for update真正的含義缺乏理解。
For update是Oracle提供的手工提高鎖級別和范圍的特例語句。Oracle的鎖機制是目前各類型資料庫鎖機制中比較優秀的。所以,Oracle認為一般不需要用戶和應用直接進行鎖的控制和提升。甚至認為死鎖這類鎖相關問題的出現場景,大都與手工提升鎖有關。所以,Oracle並不推薦使用for update作為日常開發使用。而且,在平時開發和運維中,使用了for update卻忘記提交,會引起很多鎖表故障。
那麼,什麼時候需要使用for update?就是那些需要業務層面數據獨占時,可以考慮使用for update。場景上,比如火車票訂票,在屏幕上顯示郵票,而真正進行出票時,需要重新確定一下這個數據沒有被其他客戶端修改。所以,在這個確認過程中,可以使用for update。這是統一的解決方案方案問題,需要前期有所准備。
⑶ PLSQL Developer查詢數據時for update問題
有人在鎖表, 你一直在等待。
可以用 select t.*, t.rowid from aa_yudy_deal t 這種方法。這種方法只鎖查出的結果。不影響其他人操作 其他數據。
最好不用for update ,因為只能鎖表的人自己操作這個表。
⑷ update操作,是行鎖還是表鎖
你是不是sql語句後面加『forupdate』了,如果有的話,你必須去掉,不然會鎖定的。其他的update操作一張表不會引起資源死鎖,你不commit,都是沒記錄的。
⑸ DB2中如何使用sql語句進行表鎖
寫sql語句的時候 在後面加上一個 for update 你在去執行 增加 刪除的操作 這樣子表就會容易鎖住啦。
⑹ 兩個SQL的鎖表問題
不是很明白的你的意思,查看是否鎖表的sql:
select s.SID,s.SERIAL#,s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,s.terminal,s.machine,s.program,s.osuser
from v$session s,v$lock l,dba_objects o
where s.sid=l.sid
and o.object_id=l.id1
and s.username is not null ;
如果1 .2是同時操作一張表,最好是執行完一條sql先commit一下在執行第二條這樣肯定不會鎖表,我不知道我理解對了沒有?
ps:不能,資料庫的事務機制不允許同一時刻同一記錄update 如果先update操作會先lock table等執行完釋放資源才有其他的操作。
以下是我做過的測試:
eg:select * from table for update;
1.不允許做for update查詢。
2.允許普通search查詢。
3.不允許對表中任何記錄做update操作;
4.允許insert操作;
5.不允許delete操作。
另:一樓說的是對的。
⑺ oracle執行了一條for update卡住了,沒有提交。之後再執行修改就改不了了
我根據我遇到的相同問題整理的解決方法
問題場景:
在更新或插入等DML操作中,因網路中斷或忘記提交,導致相同記錄再次執行時感知為長時間無法執行成功。
解決方法:
一、code處理
1.再次執行相同記錄的語句;
2.查詢被阻塞的會話
SELECT l.session_id,o.owner,o.object_name, machine, s.sid, s.serial#,s.blocking_session
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND s.blocking_session is not null;
3.根據被阻塞會話查找原會話信息
SELECT l.session_id, o.owner, o.object_name, machine, s.sid, s.serial#,s.sid||','||s.serial# kill_session
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND s.sid = 759;
SELECT s.sid, s.serial#,s.sid||','||s.serial# kill_session FROM v$session s WHERE sid = 759;
4.殺死原會話
alter system kill session '759,18523';
二、PLSQL處理
原理與code處理一樣,先找到現有會話,然後反推阻塞會話,最後將其殺死
1.查詢被阻塞的會話,找到Blocking session
2.根據Blocking session查找原會話信息,直接點擊kill殺會話
⑻ 資料庫鎖對象和使用SELECT * FOR UPDATE的表現和結果有何區別
1.資料庫鎖對象鎖整張表,FOR UPDATE只能跟在single後面鎖單條記錄2.資料庫鎖對象是邏輯鎖,調用才起做用。使用UNQUEUE_** DEQUEUE_**加鎖解鎖,而FOR UPDATE只在數據COMMIT或ROLLBACK後才會解鎖。3.資料庫對象對鎖定有提示,FOR UPDATE被鎖定是只能等待。這個OPEN SQL FOR UPDATE感覺比 DB里的FOR UPDATE功能要差不少