工作了一段时间,有一天测试的同事问我,我的一个后台shell脚本每次手动启动之后就像挂死在那里,也不打印日志了,当时觉得奇怪,为什么会出现这个问题呢,之前从未遇到过,打开代码,发现在挂死的那里后面有个和数据库交互去改变某一个表的字段值的操作,猜想下,估计是锁表了,和测试的同事沟通之后,果然有一个同事当时就在操作那个表中的那个字段,没有提交,刚好是我要修改的,他们的语句是select * from test for update;然后我去修改那个值得时候,当然就处于等待状态了,但到目前为止,只是猜想,要测试下知道,发了一条查询锁表的语句给测试耳朵同事,他们执行之后果然有输出,那么就证明了我的猜想,如何解锁呢?我又不得不再发一条语句给他们,问题解决了,现在把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;
第二种: select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;