3、session3查询竞争资源的表或语句,强制释放资源
-- 查询未提交事务的session信息,注意执行以下SQL,用户需要有DBA权限才行 SELECT L.SESSION_ID, S.SERIAL#, L.LOCKED_MODE AS 锁模式, L.ORACLE_USERNAME AS 所有者, L.OS_USER_NAME AS 登录系统用户名, S.MACHINE AS 系统名, S.TERMINAL AS 终端用户名, O.OBJECT_NAME AS 被锁表对象名, S.LOGON_TIME AS 登录数据库时间 FROM V$LOCKED_OBJECT L INNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_ID INNER JOIN V$SESSION S ON S.SID = L.SESSION_ID WHERE 1 = 1
查询结果如下
对我们强制释放资源有用的只有前面两个字段,例如
-- 强制 结束/kill 锁表会话语法 ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#'; -- 强制杀死session1,让session2可以修改id=5的那条记录 ALTER SYSTEM KILL SESSION '34, 111';
强制杀死session1后,注意观察session2的执行情况!我们会发现session2的等待会立即终止并执行!相信小伙伴们都有一个疑惑,session_id有29和34,如何确定他们属于session1还是session2,保证杀死的是session1让session2成功执行DML语句?
其实也很简单,这里的判断方式就是session1执行更新但不提交事务,可先用以上SQL查询未提交事务的session信息,此时查到的就是session1的信息。
总结
到此这篇关于Oracle锁表解决的文章就介绍到这了,更多相关Oracle锁表解决内容请搜索