Saya melihat stacktrace (terpotong) berikut di file 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
Memeriksa file log Postgres mengungkapkan pernyataan berikut:
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
Saya menggunakan Infinispan yang dikirim dengan JBoss 7.1.1 Final, yaitu 5.1.2.Final.
Jadi ini yang saya pikir sedang terjadi:
- Infinispan mencoba menjalankan
SELECT count(*)...
pernyataan untuk melihat apakah ada catatan dalamISPN_MIXED_BINARY_TABLE_configCache
; - Postgres, untuk beberapa alasan, tidak menyukai pernyataan ini.
- Infinispan mengabaikan ini dan membajak
CREATE TABLE
pernyataan itu. - Postgres barfs karena masih menganggap itu transaksi yang sama, yang gagal dibatalkan oleh Infinispan, dan transaksi ini diambil dari
SELECT count(*)...
pernyataan pertama .
Apa arti kesalahan ini dan ide bagaimana mengatasinya?
postgresql
jboss
infinispan
Jimidy
sumber
sumber
PSQLException: current transaction is aborted...
(25P02
) dan mungkin jugaJPA
atauHibernate
. Akhirnya itu karena penggunaan Logback (baik!) Kami yang diumpankan dengantoString()
objek DAO yang kelebihan muatan yang menyebabkan kesalahan dan tertelan dengan baik (tapi tidak disadari oleh saya):log.info( "bla bla: {}", obj )
diproduksibla bla: [FAILED toString()]
. mengubahnyalog.info( "bla bla: {}", String.valueOf( obj )
menjadi nol-aman, tetapi tidak menelannya dan dengan demikian membiarkan transaksi terbuka gagal pada kueri yang tidak terkait.Jawaban:
Saya mendapatkan kesalahan ini menggunakan Java dan postgresql melakukan penyisipan pada tabel. Saya akan menggambarkan bagaimana Anda dapat mereproduksi kesalahan ini:
Ringkasan:
Alasan Anda mendapatkan kesalahan ini adalah karena Anda telah memasukkan transaksi dan salah satu dari SQL Queries Anda gagal, dan Anda menelan kegagalan itu dan mengabaikannya. Tapi itu tidak cukup, MAKA Anda menggunakan koneksi yang sama, menggunakan TRANSAKSI SAMA untuk menjalankan kueri lain. Pengecualian dilemparkan pada kueri kedua yang dibentuk dengan benar karena Anda menggunakan transaksi yang rusak untuk melakukan pekerjaan tambahan. Postgresql secara default menghentikan Anda dari melakukan ini.
Saya menggunakan:
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".
Driver postgresql saya adalah:
postgresql-9.2-1000.jdbc4.jar
Menggunakan versi java:
Java 1.7
Berikut adalah tabel membuat pernyataan untuk menggambarkan Pengecualian:
Program Java menyebabkan kesalahan:
Kode di atas menghasilkan output ini untuk saya:
Penanganan masalah:
Anda punya beberapa pilihan:
Solusi paling sederhana: Jangan melakukan transaksi. Setel
connection.setAutoCommit(false);
keconnection.setAutoCommit(true);
. Berhasil karena SQL gagal hanya diabaikan sebagai pernyataan sql gagal. Anda dipersilakan untuk gagal pernyataan sql semua yang Anda inginkan dan postgresql tidak akan menghentikan Anda.Tetap melakukan transaksi, tetapi ketika Anda mendeteksi bahwa sql pertama gagal, kembalikan / mulai kembali atau komit / mulai ulang transaksi. Kemudian Anda dapat terus gagal sebanyak kueri sql pada koneksi database yang Anda inginkan.
Jangan menangkap dan mengabaikan Pengecualian yang dilemparkan ketika pernyataan sql gagal. Kemudian program akan berhenti pada kueri yang salah bentuk.
Dapatkan Oracle sebagai gantinya, Oracle tidak mengeluarkan pengecualian ketika Anda gagal permintaan pada koneksi dalam transaksi dan terus menggunakan koneksi itu.
Dalam membela keputusan postgresql untuk melakukan hal-hal dengan cara ini ... Oracle telah membuat Anda lembut di membiarkan tengah Anda melakukan hal-hal bodoh dan menghadap itu.
sumber
rollback()
padaConnection
saatSQLException
tertangkap. [ Pokoknya saya menyadari ini sejalan dengan filosofi PostgreSQL yang memaksa pengguna untuk membuat semuanya eksplisit, sedangkan Oracle memiliki filosofi untuk secara implisit mengurus banyak hal.]or commit/restart the transaction
. Seperti yang saya lihat tidak ada cara untuk melakukan setelah pengecualian. Ketika saya mencoba melakukan - PostgreSQL dorollback
psql
. (1) memulai transaksi, (2) menerbitkan beberapa pernyataan yang valid, (3) menerbitkan pernyataan yang tidak valid, (4) komit -> psql akan mengembalikan daripada melakukan.savepoints
untuk memutar kembali ke titik sebelum pembaruan / masukkan. Lihat stackoverflow.com/a/28640557/14731 untuk kode sampel.Periksa output sebelum pernyataan yang menyebabkannya
current transaction is aborted
. Ini biasanya berarti bahwa basis data melemparkan pengecualian bahwa kode Anda telah diabaikan dan sekarang mengharapkan permintaan berikutnya untuk mengembalikan beberapa data.Jadi sekarang Anda memiliki ketidakcocokan antara aplikasi Anda, yang menganggap semuanya baik-baik saja, dan database, yang mengharuskan Anda untuk mengembalikan dan memulai kembali transaksi Anda dari awal.
Anda harus menangkap semua pengecualian dan transaksi rollback dalam kasus tersebut.
Ini masalah yang serupa.
sumber
SQL
yang menyebabkan masalah, Anda akan memiliki beberapa bidang untuk menghilangkan masalah menggunakan ekstensibilitas PostgreSQL.Saya pikir solusi terbaik adalah menggunakan java.sql.Savepoint.
Sebelum menjalankan kueri yang dapat melempar SQLException menggunakan metode Connection.setSavepoint () dan jika pengecualian akan dibuang, Anda hanya mengembalikan ke savepoint ini, tidak mengembalikan semua transaksi.
Kode contoh:
sumber
Sudah ada beberapa pekerjaan yang dilakukan pada driver JDBC postgresql, terkait dengan perilaku ini:
lihat https://github.com/pgjdbc/pgjdbc/pull/477
Sekarang dimungkinkan, dengan mengatur
dalam koneksi (lihat https://jdbc.postgresql.org/documentation/head/connect.html ) untuk menghindari sindrom 'transaksi saat ini dibatalkan'.Overhead karena menangani savepoint di sekitar eksekusi pernyataan dijaga sangat rendah (lihat tautan di atas untuk detail).
sumber
Di Ruby on Rails PG, saya telah membuat migrasi, memigrasikan DB saya, tetapi lupa untuk me-restart server pengembangan saya. Saya me-restart server saya dan berhasil.
sumber
Alasan untuk kesalahan ini adalah bahwa ada database lain sebelum operasi yang salah menyebabkan operasi database saat ini tidak dapat dilakukan (saya menggunakan terjemahan google untuk menerjemahkan bahasa Mandarin saya ke bahasa Inggris)
sumber
Masalah telah diperbaiki di Infinispan 5.1.5.CR1: ISPN-2023
sumber
Anda perlu kembalikan. Driver JDBC Postgres sangat buruk. Tetapi jika Anda ingin menjaga transaksi Anda, dan hanya mengembalikan kesalahan itu, Anda dapat menggunakan savepoints:
Baca lebih lanjut di sini:
http://www.postgresql.org/docs/8.1/static/sql-savepoint.html
sumber
Saya memiliki masalah yang sama tetapi kemudian menyadari ada tabel dengan nama yang sama di database. Setelah menghapus itu saya bisa mengimpor file.
sumber
Ini adalah perilaku PostgreSQL yang sangat aneh, bahkan tidak "sejalan dengan filosofi PostgreSQL yang memaksa pengguna untuk membuat semuanya eksplisit" - karena pengecualian ditangkap dan diabaikan secara eksplisit. Jadi bahkan pertahanan ini tidak berlaku. Oracle dalam hal ini berperilaku lebih ramah pengguna dan (seperti saya) dengan benar - ia meninggalkan pilihan bagi pengembang.
sumber
Ini bisa terjadi jika Anda kehabisan ruang disk pada volume.
sumber
Saya hanya menemui kesalahan yang sama. Saya bisa mengetahui penyebab root dengan mengaktifkan log_statement dan log_min_error_statement di PostgreSQL lokal saya.
Saya mereferensikan ini
sumber
Saya menggunakan JDBI dengan Postgres, dan mengalami masalah yang sama, yaitu setelah pelanggaran beberapa kendala dari pernyataan transaksi sebelumnya, pernyataan berikutnya akan gagal (tetapi setelah saya menunggu sebentar, katakanlah 20-30 detik, masalahnya hilang ).
Setelah beberapa penelitian, saya menemukan masalahnya adalah saya melakukan transaksi "secara manual" di JDBI saya, yaitu saya melingkupi pernyataan saya dengan BEGIN; ... COMMIT; dan ternyata pelakunya!
Di JDBI v2, saya bisa menambahkan penjelasan @Transaction, dan pernyataan dalam @SqlQuery atau @SqlUpdate akan dieksekusi sebagai transaksi, dan masalah yang disebutkan di atas tidak terjadi lagi!
sumber
Dalam kasus saya, saya mendapatkan kesalahan ini karena file saya rusak. Sementara iterasi catatan file itu memberi saya kesalahan yang sama.
Mungkin di masa depan itu akan membantu siapa saja. Itulah satu-satunya alasan untuk mengirim jawaban ini.
sumber
Saya menggunakan pegas dengan
@Transactional
anotasi, dan saya menangkap pengecualian dan untuk beberapa pengecualian saya akan mencoba lagi 3 kali.Untuk posgresql, ketika mendapat pengecualian, Anda tidak dapat menggunakan koneksi yang sama untuk melakukan lagi. Anda harus mengembalikan terlebih dahulu.
Untuk kasus saya, saya menggunakan
DatasourceUtils
untuk mendapatkan koneksi saat ini dan meneleponconnection.rollback()
secara manual. Dan panggilan metode ini direkrut untuk mencoba lagi.sumber
Saya bekerja dengan spring boot jpa dan diperbaiki dengan menerapkan @EnableTransactionManagement
File yang dilampirkan dapat membantu Anda.
sumber
Saya bekerja dengan spring boot jpa dan diperbaiki dengan menerapkan @EnableTransactionManagement
File yang dilampirkan dapat membantu Anda.
sumber
Coba ini
COMMIT;
Saya menjalankannya di pgadmin4. Ini mungkin membantu. Ini ada hubungannya dengan perintah sebelumnya yang berhenti sebelum waktunya
sumber
Ubah tingkat isolasi dari baca berulang menjadi baca yang dilakukan.
sumber
Set conn.setAutoCommit (false) ke conn.setAutoCommit (true)
Melakukan transaksi sebelum memulai yang baru.
sumber