大家好:
   假如我有两张表,分别是A表和B表,A表数据由系统手工插入,同时A表有对应的insert触发器,insert触发器的其中之一作用是对B表进行插数据,A表触发器的功能简单,花的时间少,但同时B表也建了一个insert的触发器,B表触发器的主要作用是执行存储过程,实行账务结算的功能,需要花较长的时间。 请问AB两表的触发器能实现异步吗,也就是A表能够快速录完数据吗,按我现在的观察是A表数据的录完,要等两个触发器处理完毕,谢谢大家

解决方案 »

  1.   

    -------存储过程
    --/
    create or replace trigger pgtxnInsert 
    before insert 
    on pg_txn for each row  
    begin
       :NEW.txnday := SYSDATE+1;
       if(:new.txntype='01') then
       insert into  User_Info2(pkid,orderid,stxnamt,txnday)
       values(:new.pkid,:new.ORDERID,:new.STXNAMT,:new.txnday);
       end if;
    end;
    /--/
    create or replace trigger pgtxn2Insert 
    after insert 
    on USER_INFO2 for each row 
    begin
    pad_amt(:new.pkid,:new.ORDERID,:new.STXNAMT,:new.txnday);--执行带参数的存储过程
     end;
    /
    ---中间表
    create table User_Info2 (
       pkid VARCHAR2(500),
       orderid  VARCHAR2(200),
       stxnamt  NUMBER(20,2),
       txnday  Date DEFAULT sysdate not null ,
       constraint PK_User2_Info primary key (pkid)
    );---------------如上是我的过程,我们是第三方支付的系统,其中pg_txn是我的业务交易表,User_Info2 是我建的一张中间表,我想以此对交易进行排重,因为交易是在网关进行的,我不想因为排重影响网关的交易效率,所以建立中间表,然后异步触发
      

  2.   

    可以肯定的告诉你,如此设计不能实现异步触发
    从你的描述上看,执行带参数的存储过程并未对pg_txn 产生影响,因此有以下方法可以达到你的目的:
    1、pg_txn 用触发器同步到User_Info2 ,然后应一个定时job定时对User_Info2 操作,处理完的数据就删除
    2、不用触发器,也不用job,前台逻辑完成pg_txn数据录入后,前台通过ajax异步调用执行存储过程