我现在想锁定数据库里面的某条记录,从网上查了一下,说是用 for update nowait可以锁定一条记录,所以我写如下的sql语句 select * from tbl_upreport where f_Id = 1431 for update nowait;我在pl/sql里面执行的时候第一次没有错误提示,在更换用户以后重新执行上面的sql语句,出现错误提示说 “资源正忙,要求执行nowait”我觉着这样就可以锁定这条记录了,于是我到程序里面试,第一次执行到这句话的时候没有什么问题,我换个用户重新登陆系统,再次执行到这句话的时候还有没有什么错误提示,而且还返回一条数据。也就试说我的锁定没有成功,现在就想问一下这里的朋友,我那里出现问题了。谢谢!!!
解决方案 »
- 安装ORACLE出错
- exp导出时,如何对指定的多张表分别指定不同的导出条件?
- 付费找人开发PHP+Oracle程序,共同学习进步
- 200分求Oracle SQL语句转换为SQL Server的TSQL语句,就一句。
- 请教个sql语句,如何实现?大侠进来看一下~谢谢
- sql语句里能不能使用自己定义的变量吗?为什么呀?
- 如何在ORACLE与SQLSERVER之间传递表结构相同的两个表中的数据????
- 安裝 Oracle 9i R2 在Linux Advanced Server 3
- PB与Oracle的连接问题
- ORA01407 无法更新("YCSB_CW"."PUBKSZL"."DWDM")为null
- 使用plsql developer 7.0无法连接别人的oracle数据库
- 如何批量插入一年中所有星期一的日期
http://topic.csdn.net/u/20070524/14/8c145599-f996-492e-be59-4a4a98a26c84.html
只有我明白了原因在于,你用for update锁定的时候,必须开始一个事务
而在sql plus中,是默认有事务的,所以第一次执行锁定成功,而第二次执行锁定就只能等待了而你在代码中进行锁定没有使用事务,
那么,相应的记录行就没有办法被锁定了
不信可以试一下,
成功了要记得结贴给分,谢谢
select * from tbl_upreport where f_Id = 1431 for update nowait
后,这个记录已被锁定了session 2再执行时,session 1已将记录锁定,由于你指定了nowait, oracle会返回“资源正忙,要求执行nowait”的错误给你; 如果你不指定nowait, 就会发生阻塞,直到session 1 commit事务或rollback 事务为止