300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > oracle并发执行存储过程 关于存储过程并发处理解决方案

oracle并发执行存储过程 关于存储过程并发处理解决方案

时间:2019-11-04 10:10:35

相关推荐

oracle并发执行存储过程 关于存储过程并发处理解决方案

当前位置:我的异常网» Oracle开发»关于存储过程并发处理解决方案

关于存储过程并发处理解决方案

网友分享于:-01-05浏览:116次

关于存储过程并发处理

想测试一下存储过程处理过程中,另一个进程也调用了当前存储过程时,数据一致性的问题,现做了以下测试:

创建表A100(可理解成库存总量表)C1varchar2(10)--产品编码

C2number--产品库存总量

A200(可理解成备品出入库记录表。暂时不考虑主键问题)

C1varchar2(10)--产品编码

C2number--出入库量

创建了两个存储过程SP_TEST1、SP_TEST2。两个存储过程大多数内容一样,只是SP_TEST1在Commit前多一条dbms_lock.sleep(5);以模拟上一个处理尚未完成时,另一个处理又被调用。(存储过程见下面)

调用方法:执行SP_TEST1,紧接着执行SP_TEST2(在5秒钟之内),发现执行结果与预想的出入很大

1)第一次调用存储过程时,A100表会生成两条“产品编码”一样的记录,“产品库存总量”不同,分别是两个存储过程调用是赋的值

2)第二次(包括之后)调用时,尽管先执行的SP_TEST1,但A100表合计总量仍会漏掉SP_TEST1执行时赋予的参数量

请问:1)我这种实验方法本身有没有问题(即是否可以利用dbms_lock.sleep(5);模拟存储过程执行时间很长);

2)若我的方法没有问题,为什么并发执行时SP_TEST1的参数没有被统计并更新到表A100?

3)若我的存储过程有问题,如何编写才能避免存储过程并发调用时,库存量被错误计算(统计)?

--存储过程SP_TEST001

CREATEORREPLACEPROCEDUREsp_test001

(vNameinvarchar2,vNumbinnumber)

is

begin

declare

vA1Rcountnumber;

begin

--判断A200表中是否有c1=vName的记录如果有:update没有:insert

insertintoA200(c1,c2)values(vName,vNumb);

--判断A100表中是否有c1=vName的记录,如果有:update没有:Insert

selectcount(1)intovA1RcountfromA100wherec1=vName;

if(vA1Rcount>0)then

updateA100setc2=(selectsum(nvl(c2,0))fromA200whereA200.c1=A100.c1)whereA100.c1=vName;

else

insertintoA100(c1,c2,c3)values(vName,vNumb,0);

endif;

dbms_lock.sleep(5);

commit;

EXCEPTIONWHENOTHERSTHEN

DECLARE

Err_msgvarchar2(512):=sqlerrm;

BEGIN

Dbms_output.put_line('ORAErrormessage'||err_msg);

Rollback;

end;

end;

end;

--存储过程SP_TEST002

CREATEORREPLACEPROCEDUREsp_test002

(vNameinvarchar2,vNumbinnumber)

is

begin

declare

vA1Rcountnumber;

begin

--判断A200表中是否有c1=vName的记录如果有:update没有:insert

insertintoA200(c1,c2)values(vName,vNumb);

--判断A100表中是否有c1=vName的记录,如果有:update没有:Insert

selectcount(1)intovA1RcountfromA100wherec1=vName;

if(vA1Rcount>0)then

updateA100setc2=(selectsum(nvl(c2,0))fromA200whereA200.c1=A100.c1)whereA100.c1=vName;

else

文章评论

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。