今天遇见一个问题,花费了半个小时弄明白了。
今天执行SQL命令的时候,发现UPDATE无法执行。
问题描述:
可以执行insert、select命令。update没有测试。
无任何回执,不报错。一直在提交。
可以撤回对应的SQL命令。
可以在其他表或者数据上执行UPDATE,但是对于某些数据无法执行。(只有一行或者一个表)
可以对无法UPDATE的数据执行SELECT。
数据库正常运行(别人都在用这个数据库,如果出了问题大家还坐得住?)
怀疑被锁。
————————————————————————————
上网查询,发现这种情况很常见。
执行这个SQL,在任何表下都能执行:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo, dba_objects ao, v$session sess
where ao.object_id = lo.object_id
and lo.session_id = sess.sid;
然后,就发现了以自己主机名为地址的OS_user_name,还有我无法UPDATE 的表。
然后执行命令:
alter system kill session 'sid,serial#';
比如说,要杀掉第一条,要这么写:
alter system kill session '10378,42299';
返回值0。
按照我之前的经验,-1是没有正确执行,0是没有行更新,但是正常执行。
执行之前无法执行的UPDATE,正常插入。
问题解决。
————————————————————————————————————
定位故障发生原因:我怀疑是我开了未提交读,然后执行的时候断网。
所以一直在等待commit。
尝试过提交commit,但是下次获得的游标和之前的游标是不一致的,手工提供commit无法解决。
故障可能会自动清除,但是五分钟之内肯定是不会自动清除的。(我没处理这个故障,第二天来看好了)
故障原因:事务锁。
我开启了一个事务,但是没有提交,一直挂着。
然后我又重新创建一个一个游标做事情,把这个游标给忘了……
找游标又不知道怎么找……