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


相关文章


关于Oracle网格概念及其支撑技术的概述Oracle认证考试
Oracle数据统计(Analyze)Oracle认证考试
Oracle认证辅导:Oracleover()Oracle认证考试
Oraclelag()lead()Oracle认证考试
oracle存储过程中使用行锁的示例Microsoft认证考试
OracleSCN机制解析Microsoft认证考试
关于Oracle客户端显示乱码问题Oracle认证考试
ORACLE入门学习经验之OCAOCP认证之路Oracle认证考试
OracleOCP认证要通过哪些考试?Oracle认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛