我现在想锁定数据库里面的某条记录,从网上查了一下,说是用 for update nowait可以锁定一条记录,所以我写如下的sql语句 select * from tbl_upreport where f_Id = 1431 for update nowait;我在pl/sql里面执行的时候第一次没有错误提示,在更换用户以后重新执行上面的sql语句,出现错误提示说 “资源正忙,要求执行nowait”我觉着这样就可以锁定这条记录了,于是我到程序里面试,第一次执行到这句话的时候没有什么问题,我换个用户重新登陆系统,再次执行到这句话的时候还有没有什么错误提示,而且还返回一条数据。也就试说我的锁定没有成功,现在就想问一下这里的朋友,我那里出现问题了。谢谢!!!

解决方案 »

  1.   

    BAIDU出结果
    http://topic.csdn.net/u/20070524/14/8c145599-f996-492e-be59-4a4a98a26c84.html
      

  2.   

    oracle的锁定不阻塞读取的,锁定后是可以读的,但是不可以修改
      

  3.   

    别人都没明白你说什么,
    只有我明白了原因在于,你用for update锁定的时候,必须开始一个事务
    而在sql plus中,是默认有事务的,所以第一次执行锁定成功,而第二次执行锁定就只能等待了而你在代码中进行锁定没有使用事务,
    那么,相应的记录行就没有办法被锁定了
    不信可以试一下,
    成功了要记得结贴给分,谢谢
      

  4.   

    session 1 执行 :
    select * from tbl_upreport where f_Id = 1431 for update nowait
    后,这个记录已被锁定了session 2再执行时,session 1已将记录锁定,由于你指定了nowait, oracle会返回“资源正忙,要求执行nowait”的错误给你; 如果你不指定nowait, 就会发生阻塞,直到session 1 commit事务或rollback 事务为止