oracle存储过程中使用行锁的示例Microsoft认证考试
文章作者 100test 发表时间 2010:04:23 20:58:10
来源 100Test.Com百考试题网
问题起因:一张入库单表中字段status用来记录入库状态,入库前先判断入库标识。若未入库,则做入库处理。否则则做另一个操作……
问题来了,当两个人同时做入库处理时,取得的状态都为 未入库 ,于是,你可以想到,发生了两次入库操作。
在并发问题中,一不小心就可能出现一些不易发现的错误。这里可以通过一个锁来解决这个问题,通过锁,使该存储过程不能同时被两个线程调用来处理同一条记录。
create or replace procedure P1(pdm in varchar2) is
var_flag char(1).
begin
0select status into var_flag from #T where dm=pdm for 0update wait 5.
--开始事务
--执行业务逻辑
--修改入库标志
--提交事务
--若出异常,回滚
end P1.
注意:记录被锁定之后不可以在该记录上做操作。
--------------------------------------------------------------------------------------------------------------------------------------
SELECT...FOR UPDATE 语句的语法如下:
SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED].
其中:
OF 子句用于指定即将更新的列,即锁定行上的特定列。
WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
“使用FOR UPDATE WAIT”子句的优点如下:
1防止无限期地等待被锁定的行;
2允许应用程序中对锁的等待时间进行更多的控制。
3对于交互式应用程序非常有用,因为这些用户不能等待不确定
4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告