2010-04-06 36 views
7

Ho impostato 'max_prepared_transactions' su 20 nel postgres.config locale e tuttavia la transazione ha esito negativo con la seguente traccia di errore (ma solo su Linux). Poiché in Windows lo stesso codice funziona perfettamente, sto vagando se questo non è un problema di permesso. Quale sarebbe la soluzione? Grazie PeterOperazioni preparate con Postgres 8.4.3 su CentOS

 
372300 [Atomikos:7] WARN atomikos - XA resource 'XADBMS': rollback for XID '3137332E3230332E3132362E3139302E746D30303030313030303037:3137332E3230332E3132362E3139302E746D31' raised -3: the XA resource detected an internal error 
org.postgresql.xa.PGXAException: Error rolling back prepared transaction 
     at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:357) 
     at com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:873) 
     at com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:90) 
     at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:86) 
     at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:62) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676) 
     at java.lang.Thread.run(Thread.java:595) 
Caused by: org.postgresql.util.PSQLException: ERROR: prepared transaction with identifier "1096044365_MTczLjIwMy4xMjYuMTkwLnRtMDAwMDEwMDAwNw==_MTczLjIwMy4xMjYuMTkwLnRtMQ==" does not exist 
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) 
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) 
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:299) 
     at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:347) 
+0

Ho anche controllato le impostazioni in/proc/sys/kernel. Superano tutti i limiti descritti nel manuale di Postgresql 'Consumo di risorse' –

+0

È possibile eseguire il comando che sta causando il problema dal prompt di psql sulla finestra di linux per ottenere il livello java di mezzo per vedere se funziona? – Kuberchaun

risposta

6

cura per aiutare gli altri che cercano comprensione sugli stessi sintomi

L'errore indica che si sta ancora superando il limite di max_prepared_transactions.

Assicurati che il file di configurazione che hai modificato sia quello in uso e che hai detto a postgresql di ricaricare la sua configurazione per raccogliere il tuo max_prepared_transactions modificato.

È possibile interrogare il database per scoprire che cosa sta usando per quella impostazione con lo SQL:

SHOW max_prepared_transactions; 

risposta originale Segue (sulla base del presupposto che max_prepared_transactions è stato impostato correttamente):


Stai utilizzando setAutoCommit()? Potrebbe trattarsi di questo recentemente scoperto bug:

http://archives.postgresql.org/pgsql-jdbc/2010-03/msg00013.php

Questo altro post mostra alcuni piccoli test ripetibili di preparazione di connessioni XA, che si potrebbe dare un'occhiata a per vedere se si sta facendo qualcosa di simile:

http://archives.postgresql.org/pgsql-jdbc/2009-01/msg00025.php

+2

Grazie per la riproduzione. Ho risolto il problema. Il fatto è che recentemente ho aggiornato da Postgresql 8.1 a 8.4.3 per avere il supporto per la transazione distribuita. Durante questo processo, ho lasciato un "glitch" in /etc/init.d/postgresql in quanto l'app stava ancora utilizzando la configurazione dalla vecchia versione all'avvio. Nella vecchia configurazione 'max_prepared_transactions = 0' significa no xtransaction con postgresql –