zoukankan      html  css  js  c++  java
  • oracle中表加锁死锁的现象、原因及解决方案

    一、表加锁、死锁出现的现象

     1、对数据库操作update、insert、delete时候,数据库无法更新,操作等待时长,操作结果不发生改变;
     2、在程序中,底层(数据访问层)操作时候不成功,数据库连接超时,无法操作,或者操作等待时长等现象。
     加锁原理:如果一个操作在进行修改一表,它没完成,另一个操作也操作这张表时候就需要等待,前面操作结束之后才可进行操作。

    二、表加锁、导致死锁原因

    1、可能在Oracle中可以有计时器,在频繁操作数据库update、insert、delete语句。

     

    2、可能在.net程序中使用到timer控件,频繁地操作数据库update、insert、delete语句。 

    3、可能使用到事务处理(Tran),没有提交事务(CommintTran)或者没有回滚事务(Rollback)

    【注释】:在SqlServer数据库里面有一个隐式事务,关闭时候,每次修改插入都需要手动提交,不然就会导致死锁。 

    三、解决方案

    步骤为:
    1、执行下面SQL,先查看哪些表被锁住了:
    select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
     
    2、查处引起死锁的会话
     select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b  where a.session_id = b.sid order by b.logon_time;
     这里会列出SID
    SELECT s.username, l.OBJECT_ID, l.SESSION_ID, s.SERIAL#, l.ORACLE_USERNAME, l.OS_USER_NAME, l.PROCESS FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID; 
     
    3、 查出SID和SERIAL#:
    查V$SESSION视图:
    SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';
    这一步将得到PADDR
     
    4、查V$PROCESS视图:
    SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';
    这一步得到SPID
     
    5、杀掉进程 sid,serial#,这里的两个数是根据数据库查询得到的
    alter system kill session'210,11562';
     
     
  • 相关阅读:
    STL实现的底层数据结构简介
    C++ STL中Map的按Key排序和按Value排序
    algorithm库介绍之---- stable_sort()方法 与 sort()方法 .
    git取消更改 恢复版本命令
    unbuntu下清理磁盘空间
    x265编码命令
    SQLServer数据库获取重复记录中日期最新的记录
    牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!
    哎!又要过年了,程序员最怕问到什么?
    swagger 使用指南
  • 原文地址:https://www.cnblogs.com/liuxiaochong/p/13496803.html
Copyright © 2011-2022 走看看