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