只要有人用了:
select t.* from 表名 t where 字段=xxx for update
而不是:
select t.rowid,t.* from 表名 t where 字段=xxx for update
進行數據更新操作,就會出現這種情況.
for update 不帶rowid,是一種很傻X的行為,就像使用svn進行源碼修改不先獲取最新一樣.
如果是在客戶現場的真實庫中這樣操作還會導致客戶業務處理掛起,後果是很嚴重的.
因此,在項目組內尤其是新人需要強調相關操作規范,使相關動作形成習慣.
要查詢是誰進行了全表鎖定,參考以下語句:
"
----查詢oracle用戶名,機器名,鎖表對象
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
"
更具體內容詳見:
http://www.cnblogs.com/hangwq/p/3527969.html