1. 问题发现
在查询数据库时,忘记删除之前使用for update,其他对此表操作失败并锁表。
2. 开启修改SQL语句
SELECT * FROM TABLE_NAME FOR UPDATE; //①
SELECT T.* , T.ROWID FROM TABLE_NAME T; //②
3. 注意点
① 使用for update时,会在执行时开启事务,如果不commit,事务一直在那,如果其他程序或人操作同一张表,则会造成锁表。
② 使用T.ROWID语句在执行时不会开启事务,在修改完数据后,点击提交才会开启事务。
备注:在使用过程中尽量使用t.rowid
4. 解决方法:
查询被锁的表
select t2.username,
t2.sid,
t2.serial#,
t3.object_name,
t2.OSUSER,
t2.MACHINE,
t2.PROGRAM,
t2.LOGON_TIME,
t2.COMMAND,
t2.LOCKWAIT,
t2.SADDR,
t2.PADDR,
t2.TADDR,
t2.SQL_ADDRESS,
t1.LOCKED_MODE
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.object_id = t3.object_id
order by t2.logon_time;
解锁
alter system kill session 'sid, seial#';