• oracle锁表原因和如何解锁分享


    最近项目项目开始忙起来了,就不哔哔了,直接给你们看东西好了。

    查锁表

     
     select a.OS_USER_NAME, c.owner, c.object_name, b.sid, b.serial#, logon_time 
      from v$locked_object a, v$session b, dba_objects c 
     where a.session_id = b.sid 
       and a.object_id = c.object_id 
     order by b.logon_time; 
     

    解锁

    ALTER SYSTEM KILL SESSION '129,77'; 
     

     

    查什么系统导致上的锁

    select spid, osuser, s.program
    from v$session s,v$process p
    where s.paddr=p.addr and s.sid=129
     
     

    查看什么语句导致锁表的

    select l.session_id sid,
           s.serial#,
           l.locked_mode,
           l.oracle_username,
           s.user#,
           l.os_user_name,
           s.machine,
           s.terminal,
           a.sql_text,
           a.action
      from v$sqlarea a, v$session s, v$locked_object l
    where l.session_id = s.sid
       and s.prev_sql_addr = a.address
    order by sid, s.serial#;
     

    查看有几个表被锁

    select count(*) from v$locked_object;
     
     

    查表SPID

    129是通过查锁表查出来的SID
    select spid, oSUSEr, s.program
    from v$session s,v$process p
    where s.paddr=p.addr and s.sid=129
     

    当Kill不能解锁时,Ctrl+R CMD 输入下面这句,结束线程。

    22860是Oracle锁表线程IP,你自己要替换一下你自己的,怎么查,上面分享了
     
    orakill orcl 22860
     
     

     锁表可能原因

    1、锁表的原理:数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回滚 或者退出数据库用户 
    2、主要的锁表原因有: 
    (1) A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表
    (2)锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)
    3、减少锁表的概率方法:
    (1)减少insert 、update 、delete 语句执行 到 commite 之间的时间。具体点批量执行改为单个执行、优化sql自身的非执行速度
    (2)如果异常对事物进行回滚
  • 相关阅读:
    Java 的JDBC 数据库连接池实现方法
    在tomcat下context.xml中配置各种数据库连接池
    Eclipse大括号换行显示
    编写.reg文件 导入注册表
    servlet中使用session
    IIS7整合Tomcat6
    TOMCAT数据库连接池的配置方法总结(待续)
    windows2003下iis6.0+tomcat6.0的整合配置
    TransactSQL处理小数
    专案同时使用两种数据库
  • 原文地址:https://www.cnblogs.com/Baron-King/p/13900708.html
Copyright © 2020-2023  润新知