Fala galera,

Uns dias atrás estive perguntando sobre deadlock, li muito e vi diversos
exemplos, arrumei alguns deadlock pelo meu código mas um insiste em
acontecer sempre, já mudei e remudei, mas nada....então queria a ajuda de
vcs.

A função abaixo é chamada por um socket python, onde diversos clientes se
conectam, reparei que o deadlock só ocorre se existem mais de 10 cliente
conectados, menos disso vai normal.

O socket faz varias transações, mas o deadlock só ocorre nesta fuction, a
variável fator e chamada em outro local do python, mas é um select simples

Meu código é o seguinte:
A linha que da erro esta indicada

CREATE OR REPLACE FUNCTION passivo(char, numeric)
RETURNS Void AS
$BODY$
DECLARE
        tpo char(2);
        valor numeric(16,4);
        totalCred numeric(14,2);
        totalDes numeric(14,2);
        fatorP numeric(5,2);

        DECLARE cs_passivo CURSOR FOR SELECT total_compras, total_creditos,
total_acumulados FROM tb_passivo;
        compras tb_passivo.total_compras%TYPE;
        creditos tb_passivo.total_creditos%TYPE;
        acumulados tb_passivo.total_acumulados%TYPE;
BEGIN
        tpo = $1;
        valor = $2;

        IF tpo = 'c1' THEN
                BEGIN
                        UPDATE tb_passivo SET total_compras = total_compras
+ valor;
                END;
        ELSIF tpo = 'c2' THEN
                BEGIN
                        UPDATE tb_passivo SET total_compras = total_compras
- valor;
                END;
        ELSIF tpo = 'v1' THEN
                BEGIN
                        UPDATE tb_passivo SET total_creditos =
total_creditos + valor;
                END;
        ELSIF tpo = 'v2' THEN
                BEGIN
                        UPDATE tb_passivo SET total_creditos =
total_creditos - valor;
                END;
        ELSIF tpo = 'a1' THEN
                BEGIN
                        UPDATE tb_passivo SET total_acumulados =
total_acumulados + valor; -- NESSA LINHA QUE SEMPRE DA O ERRO
                END;
        ELSIF tpo = 'a2' THEN
                BEGIN
                        UPDATE tb_passivo SET total_acumulados =
total_acumulados - valor;
                END;
        END IF;

        BEGIN
                OPEN cs_passivo;
                FETCH cs_passivo INTO compras, creditos, acumulados;
                CLOSE cs_passivo;
        END;

        totalCred = compras + margemNum;
        totalDes = premios + creditos + bonus + pagar + acumulados;

        fatorP = ((totalDes * 100) / totalCred) / 100;

        BEGIN
                UPDATE tb_passivo SET fator = fatorP; -- update no fator;
        END;
                
END;
$BODY$
LANGUAGE 'plpgsql';



Antes esse código estava assim:


CREATE OR REPLACE FUNCTION passivo(char, numeric)
RETURNS Void AS
$BODY$
DECLARE
        tpo char(2);
        valor numeric(16,4);
        totalCred numeric(14,2);
        totalDes numeric(14,2);
        fatorP numeric(5,2);

        DECLARE cs_passivo CURSOR FOR SELECT total_compras, total_creditos,
total_acumulados FROM tb_passivo;
        compras tb_passivo.total_compras%TYPE;
        creditos tb_passivo.total_creditos%TYPE;
        acumulados tb_passivo.total_acumulados%TYPE;
BEGIN
        tpo = $1;
        valor = $2;

        IF tpo = 'c1' THEN
                UPDATE tb_passivo SET total_compras = total_compras + valor;
        ELSIF tpo = 'c2' THEN
                UPDATE tb_passivo SET total_compras = total_compras - valor;
        ELSIF tpo = 'v1' THEN
                UPDATE tb_passivo SET total_creditos = total_creditos +
valor;
        ELSIF tpo = 'v2' THEN
                UPDATE tb_passivo SET total_creditos = total_creditos -
valor;
        ELSIF tpo = 'a1' THEN
                UPDATE tb_passivo SET total_acumulados = total_acumulados +
valor; -- NESSA LINHA QUE SEMPRE DA O ERRO
        ELSIF tpo = 'a2' THEN
                UPDATE tb_passivo SET total_acumulados = total_acumulados -
valor;
        END IF;

        OPEN cs_passivo;
        FETCH cs_passivo INTO compras, creditos, acumulados;
        CLOSE cs_passivo;

        totalCred = compras + margemNum;
        totalDes = premios + creditos + bonus + pagar + acumulados;

        fatorP = ((totalDes * 100) / totalCred) / 100;

        UPDATE tb_passivo SET fator = fatorP; -- update no fator;
                
END;
$BODY$
LANGUAGE 'plpgsql';


WWW.V7V.COM.BR
Sidnei Vladisauskis 
EMAIL: [EMAIL PROTECTED]
MSN: [EMAIL PROTECTED]
SKYPE: sidneivl 
TEL.: 55 (11) 3717-4071
CEL.: 55 (11) 8116-6925



_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a