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 引发的‘资源忙’异常报告