以前对Oracle锁只概念上的一点点了解,没有认真考虑或使用过。直到在开发过程中遇到了由于没有使用锁而导致的并发问题,才对此重视起来。
举个例子来说明我遇到的问题。
一个入库单表(T_RKD),每一条记录对应着一条入库信息,还有个一对多的关联表来记录此入库单的明细信息。我使用T_RKD表中一个字段来标识这条记录是否入过库,若未入过,对明细进行入库处理。入过之后,修改入库标志。以上操作通过一个存储过程来完成。
以上操作,当两个人同时处理一条入库记录的时候,两个人同时取入库标志,看到的都是未入过库,然后,你可以想到了,入库操作就被做了两次。
并发操作的时候,如果考虑不周,会出现很多难以发现的错误。这时就可以用到锁了。我使用一个行锁来解决这个问题,通过锁,使该存储过程不能同时由多个线程调用,处理同一条记录。
存储过程的大致代码如下:
create or replace procedure P1(pdm in varchar2) is
v_flagrk char(1);
begin
select flagrk into v_flagrk from t_rkd where dm=pdm for update wait 5;
--开始事务
--执行业务逻辑
--修改入库标志
--提交事务
--若出异常,回滚
end P1;
/
在存储过程开始执行的时候,先申请独占锁,这样就可以避免由于并发导致的业务逻辑被多次执行的问题。
/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn 电邮:wallimn@sohu.com 时间:2009-10-17
博客:http://wallimn.iteye.com
网络硬盘:http://wallimn.ys168.com
/***********文章发表请与本人联系,作者保留所有权利*************/
以上为在存储过程中锁住一条记录,比较容易想到,其实还有一种情况,是要同时锁住多条记录,如库存数据。如何来解决呢,我翻了几遍PL/SQL程序设计,加上一点灵感,才想到解决方案,很简单,贴出来希望对朋友们有帮助,使用下面的代码就可以了:
create or replace procedure P2(pdm in varchar2) is
type kcdm_table_type is table of T_KC.dm%TYPE index by binary_integer;
kcdm_table kcdm_table_type;
begin
select dm bulk collect into kcdm_table from T_KC
where ...
for update wait 7;
--开始事务
--执行业务逻辑
--提交事务
--若出异常,回滚
end P2;
/
就是使用bulk collect,执行一个批量操作。
以上我是首次研究使用锁的一点想法,欢迎大家留言与我讨论。
分享到:
相关推荐
Oracle存储过程中使用临时表 会话级临时表 事务级临时表
oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例
本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
Oracle存储过程基本语法及示例,都是些基础,我喜欢基础扎实
oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel
java调用oracle存储过程的几个小示例+分页
oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现
这是一个简单的oracle代码,可进行参考
oracle 存储过程实例 oracle存储过程实例
帆软报表调用Oracle存储过程如果存储过程定义中没有参数,但是设计器中缺弹出一个storeParameter1参数的解决插件
ORACLE存储过程中定义数组并且判断某值是否在数组中。有例子可執行、 、有例子可執行、
一些sql server和oracle存储过程示例
oracle 存储过程 函数 dblink 绝对对工作和平时学习有价值的资料。针对个人具体情况做修改即可使用
使用java实现oracle存储过程。 共有3个小例子。实现的功能 1、无返回值的存储过程 如 insert 2、有返回值的存储过程(非列表)select id from tab 3、返回列表 如:select * from tab 顺便鄙视下csdn,作为一个it...
oracle 存储过程 unwrap 图形解密 工具
ibatis调用oracle存储过程分页
pb中执行oracle存储过程脚本; 使用批处理进行oracle存储过程脚本的创建和更新的处理。 此程序在pb中进行实现;
Oracle存储过程详细使用手册,自己整理
linux系统中使用shell脚本对oracle存储过程进行编译
oracle 存储过程批量提交