并发调用oracle 存储过程

并发调用oracle 存储过程

想挽留 发布于 2021-11-29 字数 8003 浏览 868 回复 4

CREATE OR REPLACE PROCEDURE MAN_ACCOUNT_MRGREDATE_INSERT


(v_sellerid        in varchar2,

v_professtype     in varchar2,

v_plattype        in varchar2,

v_margin          in varchar2,

v_saleamount      in varchar2,

v_priceamount     in varchar2,

v_serviceCharge   in varchar2,

v_creditDate      in varchar2,

v_refundAmount    in varchar2,

v_return_code     out varchar2)

is

l_marginid man_act_margin_record.marginid%type;

l_count number;

--l_sellerid man_act_margin_record.sellerid%type;

begin

--v_return_code := '0000';

 

select count(*) into l_count from man_act_margin_record m

where m.credit_date = to_date(v_creditDate,'yyyy-MM-dd')

and m.sellerid = v_sellerid and m.professtype = v_professtype and m.plattype = v_plattype;

  --记录已存在,直接返回入库成功

  if l_count>0 then

   

  delete from man_act_margin_record m

  where m.credit_date = to_date(v_creditDate,'yyyy-MM-dd')

  and m.sellerid = v_sellerid and m.professtype = v_professtype and m.plattype = v_plattype;

 

   -- 生成主键

  select 'M'||to_char(sysdate, 'yymmddhh24miss') ||

        trim(to_char(SEQ_MAN_ACT_MARGIN_RECORD.nextval, '000000'))

   into l_marginid

   from dual;

  insert into man_act_margin_record

    (marginid,

     sellerid,

     professtype,

     plattype,

     margin,

     saleamount,

     priceamount,

     service_charge,

     credit_date,

     create_date,

     refund_amount)

  values

    (l_marginid,

     v_sellerid,

     v_professtype,

     v_plattype,

     v_margin,

     v_saleamount,

     v_priceamount,

     v_serviceCharge,

     to_date(v_creditDate, 'yyyy-MM-dd'),

    sysdate,

     v_refundAmount

     );

   

     v_return_code := '0000';

   

    else

   

     -- 生成主键

  select 'M'||to_char(sysdate, 'yymmddhh24miss') ||

        trim(to_char(SEQ_MAN_ACT_MARGIN_RECORD.nextval, '000000'))

   into l_marginid

   from dual;

  insert into man_act_margin_record

    (marginid,

     sellerid,

     professtype,

     plattype,

     margin,

     saleamount,

     priceamount,

     service_charge,

     credit_date,

     create_date,

     refund_amount)

  values

    (l_marginid,

     v_sellerid,

     v_professtype,

     v_plattype,

     v_margin,

     v_saleamount,

     v_priceamount,

     v_serviceCharge,

     to_date(v_creditDate, 'yyyy-MM-dd'),

    sysdate,

     v_refundAmount

     );

  v_return_code := '0000';

 

  end if;

  commit;

 

exception

  when others then

    v_return_code := '1111';

   rollback;

   raise;

end;

我在java代码中并发调用该存储过程,并用log4j打印调用日志,日志显示成功调用2566次,并成功插入到目标表中,但是在oracle实际查询时,数据量却少了100多条,而且每次执行程序,数据量少的数目都不一样。关键是,程序未报异常。

在我的程序中,嵌套两个多线程,第一个是生产者消费者模式(多线程),即同时生产出多个实例,消费者并发,在某个消费者中,又并发多个线程,去调用上面的存储过程。

通过日志初步判断,每个线程都进了存储过程,但是有些并没有执行完存储过程,并返回成功代码'0000',导致了上述的结果。

有oracle大牛,帮忙看看什么问题,不胜感激。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

孤檠 2021-12-01 4 楼

@
maradona 可以描述的清楚点吗,我也看看

残花月 2021-12-01 3 楼

不是很清楚如何手动提交,麻烦给个详细点的说明,谢谢!

蓝颜夕 2021-12-01 2 楼

回复
手动提交就是把你存储过程中的commit去掉,如果是成熟项目的话就只需要做这个就可以了

成熟稳重的好男人 2021-12-01 1 楼

手动提交事务不行?