Я вижу следующую (усеченную) стековую трассировку в файле server.log JBoss 7.1.1 Final:
Caused by: org.postgresql.util.PSQLException:
ERROR: current transaction is aborted, commands ignored until end of
transaction block
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
at org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection$StatementHandler.invoke(AbstractJdbc23PooledConnection.java:455)
at $Proxy49.executeUpdate(Unknown Source) at org.jboss.jca.adapters.jdbc.WrappedStatement.executeUpdate(WrappedStatement.java:371)
at org.infinispan.loaders.jdbc.TableManipulation.executeUpdateSql(TableManipulation.java:154) [infinispan-cachestore-jdbc-5.1.2.FINAL.jar:5.1.2.FINAL]
... 154 more
Проверка файла журнала Postgres показывает следующие утверждения:
STATEMENT: SELECT count(*) FROM ISPN_MIXED_BINARY_TABLE_configCache
ERROR: current transaction is aborted, commands ignored until end of transaction block
STATEMENT: CREATE TABLE ISPN_MIXED_BINARY_TABLE_configCache(ID_COLUMN VARCHAR(255) NOT NULL, DATA_COLUMN BYTEA, TIMESTAMP_COLUMN BIGINT, PRIMARY KEY (ID_COLUMN))
ERROR: relation "ispn_mixed_binary_table_configcache" does not exist at character 22
Я использую Infinispan, поставляемый с JBoss 7.1.1 Final, то есть 5.1.2.Final.
Вот что я думаю происходит:
- Infinispan пытается запустить
SELECT count(*)...
оператор, чтобы увидеть, есть ли какие-либо записи вISPN_MIXED_BINARY_TABLE_configCache
; - Postgres почему-то не нравится это утверждение.
- Infinispan игнорирует это и продвигает
CREATE TABLE
заявление. - Postgres barfs, потому что он все еще думает, что это та же транзакция, которую Infinispan не удалось откатить, и эта транзакция формируется из первого
SELECT count(*)...
оператора.
Что означает эта ошибка и есть идеи, как ее обойти?
postgresql
jboss
infinispan
Jimidy
источник
источник
PSQLException: current transaction is aborted...
(25P02
) и, возможно, такжеJPA
илиHibernate
. Наконец это было связано с нашим (хороший!) Logback использования подается сtoString()
-overloaded объект DAO , который вызвал ошибку и был приятно проглоченной (но accidentially незамеченной мною):log.info( "bla bla: {}", obj )
производитсяbla bla: [FAILED toString()]
. изменив его,log.info( "bla bla: {}", String.valueOf( obj )
сделав его нулевым, но не проглотив его, и, таким образом, оставив транзакцию открытой при сбое несвязанного запроса.Ответы:
Я получил эту ошибку, используя Java и postgresql, делая вставку в таблицу. Я проиллюстрирую, как вы можете воспроизвести эту ошибку:
Резюме:
Причина, по которой вы получаете эту ошибку, заключается в том, что вы ввели транзакцию и один из ваших SQL-запросов не прошел, и вы сожрали этот сбой и проигнорировали его. Но этого было недостаточно, ТОГДА вы использовали то же самое соединение, используя ОДНУ ЖЕ СДЕЛКУ, чтобы выполнить другой запрос. Исключение возникает при втором правильно сформированном запросе, потому что вы используете прерванную транзакцию для выполнения дополнительной работы. Postgresql по умолчанию останавливает вас от этого.
Я использую:
PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit".
Мой драйвер postgresql:
postgresql-9.2-1000.jdbc4.jar
Используя версию Java:
Java 1.7
Вот инструкция создания таблицы, иллюстрирующая исключение:
Java-программа вызывает ошибку:
Приведенный выше код производит этот вывод для меня:
обходные:
У вас есть несколько вариантов:
Самое простое решение: не участвовать в сделке. Установите
connection.setAutoCommit(false);
дляconnection.setAutoCommit(true);
. Это работает, потому что тогда неудачный SQL просто игнорируется как неудачный SQL-оператор. Вы можете проваливать SQL-запросы все, что хотите, и postgresql не остановит вас.Оставайтесь в транзакции, но когда вы обнаружите, что первый sql не удалось, откат / перезапуск или фиксация / перезапуск транзакции. Затем вы можете продолжать выполнять столько SQL-запросов для этого подключения к базе данных, сколько хотите.
Не перехватывайте и не игнорируйте исключение, которое выдается при сбое оператора SQL. Затем программа остановится на некорректном запросе.
Вместо этого получите Oracle, Oracle не выдает исключение, когда вы не выполняете запрос на соединение в транзакции и продолжаете использовать это соединение.
В защите решения PostGreSQL, чтобы сделать что - то так ... Oracle был сделать вас мягким в середине позволяя вам делать тупые вещи и вид его.
источник
rollback()
наConnection
когдаSQLException
поймана. [ Во всяком случае, я понял, что это соответствует философии PostgreSQL, заставляющей пользователя делать все ясно, в то время как Oracleor commit/restart the transaction
. Как я вижу, нет никакого способа сделать коммит после исключения. Когда я пытаюсь зафиксировать - PostgreSQL делаетrollback
psql
. (1) начать транзакцию, (2) выдать несколько допустимых операторов, (3) выдать недопустимый оператор, (4) commit -> psql выполнит откат вместо фиксации.savepoints
для отката до точки перед обновлением / вставкой. См. Stackoverflow.com/a/28640557/14731 для примера кода.Проверьте вывод перед оператором, который вызвал
current transaction is aborted
. Обычно это означает, что база данных вызвала исключение, которое ваш код проигнорировал, и теперь ожидает, что следующие запросы вернут некоторые данные.Таким образом, теперь у вас есть несоответствие состояния между вашим приложением, которое считает, что все в порядке, и базой данных, которое требует от вас отката и перезапуска транзакции с самого начала.
В таких случаях вы должны перехватывать все исключения и транзакции отката.
Вот похожая проблема.
источник
SQL
причину проблемы, у вас будет поле для устранения проблемы с помощью расширяемости PostgreSQL.Я думаю, что лучшим решением является использование java.sql.Savepoint.
Перед выполнением запроса, который может выдать SQLException, используйте метод Connection.setSavepoint (), и, если будет сгенерировано исключение, вы только откатитесь до этой точки сохранения, а не откатите всю транзакцию.
Пример кода:
источник
Над драйвером postgresql была проделана определенная работа, связанная с этим поведением:
см. Https://github.com/pgjdbc/pgjdbc/pull/477.
Теперь это возможно, установив
в соединении (см. https://jdbc.postgresql.org/documentation/head/connect.html ), чтобы избежать синдрома «текущая транзакция прервана».Накладные расходы из-за обработки точки сохранения при выполнении оператора остаются очень низкими (подробности см. По ссылке выше).
источник
В Ruby on Rails PG я создал миграцию, перенес свою БД, но забыл перезапустить сервер разработки. Я перезапустил свой сервер, и он работал.
источник
Причина этой ошибки заключается в том, что существуют другие базы данных, прежде чем неправильная операция привела к невозможности выполнения текущей операции базы данных (я использую перевод Google, чтобы перевести мой китайский на английский)
источник
Эта проблема была исправлена в Infinispan 5.1.5.CR1: ISPN-2023
источник
Вам нужно откатиться. Драйвер JDBC Postgres довольно плохой. Но если вы хотите сохранить транзакцию и просто откатить эту ошибку, вы можете использовать точки сохранения:
Узнайте больше здесь:
http://www.postgresql.org/docs/8.1/static/sql-savepoint.html
источник
У меня была такая же проблема, но потом я понял, что в базе данных есть таблица с таким же именем. После удаления я смог импортировать файл.
источник
Это очень странное поведение PostgreSQL, оно даже не «соответствует философии PostgreSQL по принуждению пользователя делать все явным» - исключение было явно обнаружено и проигнорировано. Так что даже эта защита не держится. Oracle в этом случае ведет себя гораздо удобнее и (как по мне) правильно - это оставляет выбор разработчику.
источник
Это может произойти, если у вас недостаточно места на диске.
источник
Я просто сталкиваюсь с той же ошибкой. Мне удалось выяснить первопричину, включив log_statement и log_min_error_statement в моем локальном PostgreSQL.
Я сослался на это
источник
Я использую JDBI с Postgres и столкнулся с той же проблемой, то есть после нарушения какого-либо ограничения из оператора предыдущей транзакции последующие операторы не будут выполнены (но через некоторое время, скажем, 20-30 секунд, проблема исчезнет) ).
После некоторого исследования я обнаружил, что проблема заключалась в том, что я выполнял транзакцию "вручную" в моем JDBI, то есть я окружил свои утверждения с помощью BEGIN; ... COMMIT; и оказывается виновником!
В JDBI v2 я могу просто добавить аннотацию @Transaction, и операторы внутри @SqlQuery или @SqlUpdate будут выполняться как транзакция, и вышеупомянутой проблемы больше не будет!
источник
В моем случае я получал эту ошибку, потому что мой файл был поврежден. Итерируя записи файлов, он выдавал ту же ошибку.
Может быть, в будущем это кому-нибудь поможет. Это единственная причина, чтобы опубликовать этот ответ.
источник
Я использую Spring с
@Transactional
аннотацией, и я ловлю исключение, и для некоторого исключения я буду повторять 3 раза.Для posgresql, когда получено исключение, вы не можете больше использовать одно и то же соединение для фиксации. Сначала необходимо выполнить откат.
В моем случае я использую,
DatasourceUtils
чтобы получить текущее соединение и позвонитьconnection.rollback()
вручную. И вызов метода recruive для повтора.источник
Я работал с весенней загрузкой jpa и исправил, реализовав @EnableTransactionManagement
Прикрепленный файл может помочь вам.
источник
Я работал с весенней загрузкой jpa и исправил, реализовав @EnableTransactionManagement
Прикрепленный файл может помочь вам.
источник
Попробуй это
COMMIT;
Я запускаю это в pgadmin4. Это может помочь. Это связано с преждевременной остановкой предыдущей команды
источник
Измените уровень изоляции с повторяемого чтения на прочитанное зафиксированное.
источник
Установите для conn.setAutoCommit (false) значение conn.setAutoCommit (true)
Зафиксируйте транзакции перед началом новой.
источник