在oracle数据库中对一张表的记录先查询出来,然后做更新操作,现在在数据量大的情况下老是锁住了记录,请问是不是我的程序原因造成的,如果是该怎么解决?

解决方案 »

  1.   

    估计你是用for update of了
    这样别人用的时候只能等待锁被释放,要不只能无限制的等待...
      

  2.   

    比如有两个用户一个userA,一个userB
    当userA发出 select * from 表名 for update of 字段 时
    这是纪录被锁住等待更新
    当userB此时也发出select * from 表名 for update of 字段 时
    并且for update of 的纪录已经被userA锁定
    这是userB只能等待userA提交后才能获取到userA被占用的纪录
    如果userA不提交userB就会无限期的等待
    解决方法
    userB执行select * from 表名 for update of 字段 no wait 10;
    这时虽然纪录被userA锁定但是userB会等待10秒如果10秒内userA释放
    了纪录,则userB获取该锁,如果10秒后userA未释放锁,则userB返回
    错误消息
    ora-30006:资源已被占用;执行此操作时出现wait超时
      

  3.   

    我没有用FOR UPDATE 锁表, 就是有时候会锁住一条记录,不知道是什么原因?
      

  4.   

    userA锁住一条纪录
    userB锁住一条纪录
    userA请求锁住userB正在锁住的纪录
    而同时userB请求锁住userA正在锁住的纪录
    这时候就会产生死锁
      

  5.   

    userB执行select * from 表名 for update of 字段 no wait 10; 
    这时虽然纪录被userA锁定但是userB会等待10秒如果10秒内userA释放 select * from student for update of age no wait 100
      

  6.   

    在UPDATE之前先判断是否这条数据在修改
      

  7.   

    杀死"Oracle"死锁进程的具体步骤:   1.查哪个过程被锁   查V$DB_OBJECT_CACHE视图:      SELECT * FROM V$DB_OBJECT_CACHE   WHERE OWNER='过程的所属用户' AND CLOCKS!='0';    2. 查是哪一个SID,通过SID可知道是哪个SESSION.   查V$Access视图:      SELECT * FROM V$ACCESS WHERE   OWNER='过程的所属用户' AND NAME='刚才查到的过程名';   3. 查出SID和SERIAL#   查V$SESSION视图:      SELECT SID,SERIAL#,PADDR FROM   V$SESSION WHERE SID='刚才查到的SID'     查V$PROCESS视图:      SELECT SPID FROM V$PROCESS   WHERE ADDR='刚才查到的PADDR';   
         4. 杀进程   (1).先杀Oracle进程:      ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';    
      (2).再杀操作系统进程:   KILL -9 刚才查出的SPID   或   ORAKILL 刚才查出的SID 刚才查出的SPID。