Usa stored procedures, nas rotinas criticas, fazendo todo o procedimento nela, também nos procedimentos concorrentes, isso resolve o problema.
Por exemplo esse TRIGGER é parecido com o que vc tem que fazer
CREATE TRIGGER "AJ" FOR "PED_IT_TMP"
ACTIVE BEFORE INSERT POSITION 0
as
declare variable DATA TIMESTAMP;
declare variable QT_VENDAS NUMERIC(9, 3);
declare variable N_VENDAS NUMERIC(9, 3);
declare variable QTD NUMERIC(9, 3);
declare variable NQT NUMERIC(9, 3);
declare variable QT NUMERIC(9, 3);
declare variable TP VARCHAR(10);
declare variable DT INTEGER;
declare variable TOT DECIMAL(9, 3);
begin
data=CURRENT_DATE;
qt=PED_IT_tmp.QUANT;
select tipo from pedidos where cod=PED_IT_tmp.cod_ped into tp;
select vendas,qt_vend,pro_eqtd from produto1 where COD=PED_IT_tmp.cod_prod INTO :qt_vendas,:N_vendas,:qtd;
if (tp<>'Devolucao') then
begin
nqt=:qtd-:qt;
update produto1 set pro_eqtd=:nqt,
dt_ult_vend=:data,
qt_ult_vend=:QT,
qt_vend=:N_vendas+1,
vendas=:qt_vendas+:qt,
VAL_COMP=(PRO_CUSTO*:NQT),
VAL_VEND=(PRO_VVEND*:NQT) WHERE COD=PED_IT_tmp.cod_prod ;
end
else
begin
nqt=:qtd+:qt;
update produto1 set pro_eqtd=:nqt,
dt_ult_vend=:data,
qt_ult_vend=:QT,
qt_vend=:N_vendas-1,
vendas=:qt_vendas-:qt,
VAL_COMP=(PRO_CUSTO*:NQT),
VAL_VEND=(PRO_VVEND*:NQT) WHERE COD=PED_IT_tmp.cod_prod ;
end
end
ele atualiza uma movimentação inteira (tipo todos os itens de um pedido), a partir dessa stored procedure
CREATE PROCEDURE "AJUSTA_EST_TOTAL"
(
"C_PED" INTEGER
)
AS
BEGIN EXIT; END ^
ALTER PROCEDURE "AJUSTA_EST_TOTAL"
(
"C_PED" INTEGER
)
AS
declare variable CLI INTEGER;
declare variable TIPO VARCHAR(15);
declare variable TP VARCHAR(1);
begin
insert into PED_IT_TMP select * from "PED_IT" where cod_ped=:c_ped;
delete from PED_IT_TMP where cod_ped=:c_ped;
select cli,tipo from pedidos where cod=:"C_PED" into :cli,:tipo;
execute procedure tp1 :tipo RETURNING_VALUES :tp;
if (tp='V') then tp='P';
update pedidos set
fechado='T',
blq='T',
data=current_date,
hora=current_time where cod=:c_ped;
update ped_it set
data=current_date,
tipo=:"TP" where cod_ped=:c_ped;
update EMPRESA set DT_ULT_COMP=current_date where empr_cod=:cli;
suspend;
end
a única informação que trafega na rede é o nº do pedido, mesmo com 20 transações diferentes o FB gerencia.
Eu passo todo trabalho para o servidor FB, em 80% das tarefas, é mais rápido e sem erros.
espero ter dado uma dica, pode dar trabalho no inicio, mas resolve.