select * from tb_dinge where id = '10321' for update这个语句是在oracel中写的问题是:查询语句没有加for update就可以查出数据,加上for update后就一直在查询,一直到连接超时。
并且id换成其他的也可以查出数据。备注:tb_dinge是表名,id是tb_dinge的主键。连接oracel用的是PLsql软件。各位高手帮帮忙啊。

解决方案 »

  1.   

    在developer中吗?
    select * from tb_dinge where id = '10321' for update
    这个只是会给表上ID=‘10321’这一行加上行级锁,只允许其他session查询,不允许修改,
    对于你说的加上for update 之后一直在查询直到超时,这个好像还没遇到过也,你可以说详细点事怎么回事,这样才好模拟你的环境。
      

  2.   

    怀疑你这个语句运行了不止一次,上次运行的还没commit并去锁.
      

  3.   

    有可能,建议楼主加个 nowait
      

  4.   

    select * from tb_dinge where id = '10321'
    这一行被lock住了
    找到该lock,结束session
    或者commit
      

  5.   

    是在plsql里面执行的语句
      

  6.   

    一般不是加一个rowid就可以解锁吗,加for update也可以。我就是疑问为什么只有这个id加for update就有问题,其他的都没事,数据都一样啊。是不是有什么特殊的原因。
      

  7.   

    nowait?怎么加啊?不好意思,实在不会。
      

  8.   


    select * from tb_dinge where id = '10321' for update nowait
      

  9.   

    弹出个提示:resource busy and acquire with NOWAIT specified
      

  10.   

    这就对了撒,说明别的session锁住了该表,这么说你就是之前不止执行了一次select * from tb_dinge where id = '10321' for update
    你先commit提交事务后再做。
    或者查下那个session锁住了该表,然后kill 
      

  11.   

    不是很明白,我的分给定你了。
    但是。。‘你先commit提交事务后再做。
    或者查下那个session锁住了该表,然后kill’
    这个不明白。
      

  12.   

    哦,我突然领悟了,你的意思是:我有没有commit的任务。所以不让我update。我瞅瞅。
      

  13.   


    就是表操纵语言 insert update delete 会加锁的
    所以要提交
      

  14.   

    不行啊。他就是一直在执行中。我点了那个图标(一个绿色的下箭头,下面是个圆盘,鼠标在上面显示:commit F10)了。
      

  15.   

    该数据被锁住了,查看一下该表是否有记录被锁住,然后杀掉那个session,然后重新提交查询。
      

  16.   

    杀session?session在哪?怎么杀?
      

  17.   

    你kill加锁的sessionSQL> edi
    已写入 file afiedt.buf  1  select b.username,b.sid,b.serial#
      2  from v$locked_object a,v$session b
      3* where a.session_id=b.sid
    SQL> /未选定行SQL> alter system kill session 'sid,serial#'