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
