求教两个update的问题 1. 如果在for update一个行后 网络断掉 这个行会在什么时候解锁2. 如何查询一个行是否被锁定 如果需要for update时 是否要事先判断下这个行是否被锁定 防止重复加锁

解决方案 »

  1.   

    1  select .... from update是悲观加锁,你断开连接了意味着你的会话异常关闭了,其余的要由服务器来释放了。具体锁定时间不知道,一般需要手工解锁。
    2 不需要判断,如果已经被锁,ORACLE会提示你,资源正忙。但可以用select .... from update nowait,不需要等待。如果已被锁,立即失败,如果未被锁,立即成功锁定!
      

  2.   

    非常感谢 还有点迷惑
    1. 如果客户端很多 其中一部分断掉了 是不是意味着服务器要处理很多异常会话 而手动解锁也是很困难的
       也不可能有专人来处理这个问题吧 现实中有什么机制可以解决这种问题
    2. 为防止我要加锁的行 已被锁 我应该在每次for update的时候都使用nowait是吗
    谢谢 
      

  3.   

    1 是的。如果很多session断开了,服务器确实有很多异常会话。对服务器来说,它并未能立即感知客户端异常断开,所以它依然会保留锁。此时需要手工kill session。DBA就是你提到的这个专人,这些工作的是他们的分内事。
    2 不是必须加,看你是否能接受等待了。如果你不希望等待,就加之。
      

  4.   


    呵呵 还想问问 假如我在各地分布有客户端 一个地区的网断掉了 为了防止这个情况 DBA要实时的监控服务器运行状态(或写某种自动程序)是吗
      

  5.   

    可以通过v$lock或者v$lock_object 视图查看被锁的对象
    select * from v$lock_object where table_name='';
      

  6.   


    非常赞同 给我很多帮助 晚上回家做了个实验 在本机上用两个用户分别登陆 第一个用户使用For update 锁定行 
    第二个用户也使用For update试图锁定同一个行 提示资源正忙
    然后杀死第一个用户的进程 第二个用户马上就可以锁定这个行了 
    不知道这样测试 是否有问题 测试结果是否可供参考
      

  7.   

    1:会一直锁下去 
    2:for update no wait 
    这语句检测到锁住时,会立即返回
    也可以加上时间
      

  8.   


     1. 如果在for update一个行后 网络断掉 这个行会在什么时候解锁
    这个不仅仅是for update,所有的session的连接都是如此,如果是网络导致的问题,只能kill session了
     2. 如何查询一个行是否被锁定 如果需要for update时 是否要事先判断下这个行是否被锁定 防止重复加锁
    不需要,for update会block,知道前面提交。才进行这次的操作