2014-01-29 Alessandro Lima <[email protected]>

> Bom dia, estou migrando
>

migrando de ... ? para ... ?


>  minha aplicação que utiliza duas base de dados postgresql 9.2 e ao
> realizar transações nas duas bases
>

Duas bases PostgreSQL? Por que decidiu usar PREPARED TRANSACTIONS para tal
tarefa?




> o rollback deixou de funcionar, segue abaixo o log:
>
>
Seus logs estão meio bagunçados, fica meio difícil identificar... mas:


>  [4-1] id:0 LOG:  execute S_1: BEGIN
> [5-1] id:0 ERROR:  value too long for type character varying(60)
>

Esse erro que ocorreu aqui irá abortar sua transação. E aqui mesmo o
PostgreSQL já irá fazer o ROLLBACK, não adianta nem tentar executar como
uma "prepared transaction".


> [6-1] id:0 STATEMENT:  INSERT INTO Cidade (nome) VALUES ($1) returning
> codigo
>

Com certeza o campo nome só aceita até 60 caracteres e foi tentado inserir
mais do que isso. Pelo nome da tabela, eu diria para aumentar esse valor,
60 caracteres para nomes (principalmente de cidades) é muito pouco.



> [7-1] id:181376 LOG:  execute <unnamed>: PREPARE TRANSACTION
> '4871251_AgAAAF42gdhhbGVzc2FuZHJvLXBjLHNlcnZlcixQMTAw_YWxlc3NhbmRyby1wYyxzZXJ2ZXIsUDEwMCwA'
> [7-1] id:0 LOG:  execute <unnamed>: PREPARE TRANSACTION
> '4871251_AgAAAF42gdhhbGVzc2FuZHJvLXBjLHNlcnZlcixQMTAw_YWxlc3NhbmRyby1wYyxzZXJ2ZXIsUDEwMCwB'
> [8-1] id:0 LOG:  execute <unnamed>: COMMIT PREPARED
> '4871251_AgAAAF42gdhhbGVzc2FuZHJvLXBjLHNlcnZlcixQMTAw_YWxlc3NhbmRyby1wYyxzZXJ2ZXIsUDEwMCwA'
> [8-1] id:0 LOG:  execute <unnamed>: COMMIT PREPARED
> '4871251_AgAAAF42gdhhbGVzc2FuZHJvLXBjLHNlcnZlcixQMTAw_YWxlc3NhbmRyby1wYyxzZXJ2ZXIsUDEwMCwB'
> [9-1] id:0 ERROR:  prepared transaction with identifier
> "4871251_AgAAAF42gdhhbGVzc2FuZHJvLXBjLHNlcnZlcixQMTAw_YWxlc3NhbmRyby1wYyxzZXJ2ZXIsUDEwMCwB"
> does not exist
>

Parece que o log está meio misturado com outras sessões, mas como a
transação já foi abortada no INSERT INTO, o comando PREPARE TRANSACTION
'487...' nem chegou a ser, de fato, executado pelo PostgreSQL, logo o
COMMIT PREPARED não vai functionar.

Se está usando "prepared transaction" para sincronizar com outro banco ou
outra fonte, você deveria ter tratado a exceção ocorrida e executado um
ROLLBACK tanto nessa quanto na remota, nem mesmo deveria ter executado o
PREPARED TRANSACTION, já que não faz sentido algum fazê-lo em uma transação
já abortada.



> [10-1] id:0 STATEMENT:  COMMIT PREPARED
> '4871251_AgAAAF42gdhhbGVzc2FuZHJvLXBjLHNlcnZlcixQMTAw_YWxlc3NhbmRyby1wYyxzZXJ2ZXIsUDEwMCwB'
>
>
obs.: o parâmetro max_prepared_statements já está configurado.
>
>
Percebemos, se não estivesse o erro seria outro.



> alguma dica?
>
>
Além das acima:

Se as "prepared transactions" estão sendo gerenciadas por um framework
externo, está sendo feito absurdamente errada, melhor verificar. E se você
não está sincronizando com uma fonte ou processo externo, não deveria estar
usando "prepared transactions" (vi, infelizmente, muitos casos de pessoas
usando isso sem necessidade e sem entender as reais implicações,
principalmente os "javeiros" com o "XA"). Minha dica é, estude bem e
análise se realmente precisa disso.

Mais uma coisa, não entendi bem sua dúvida, por que citou que o "rollback
deixou de funcionar"? Nem vi a tentativa de um ROLLBACK explícito nos logs
acima.


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a