PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PSQLException:transaksi saat ini dibatalkan, perintah diabaikan hingga akhir blok transaksi

Saya mendapatkan kesalahan ini menggunakan Java dan PostgreSQL melakukan penyisipan di atas meja. Saya akan mengilustrasikan bagaimana Anda dapat mereproduksi kesalahan ini:

org.postgresql.util.PSQLException: ERROR: 
current transaction is aborted, commands ignored until end of transaction block

Ringkasan:

Alasan Anda mendapatkan kesalahan ini adalah karena Anda telah memasukkan transaksi dan salah satu Kueri SQL Anda gagal, dan Anda melahap kegagalan itu dan mengabaikannya. Tapi itu tidak cukup, KEMUDIAN 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 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 pernyataan pembuatan tabel untuk mengilustrasikan Pengecualian:

CREATE TABLE moobar
(
    myval   INT
);

Program Java menyebabkan kesalahan:

public void postgresql_insert()
{
    try  
    {
        connection.setAutoCommit(false);  //start of transaction.
        
        Statement statement = connection.createStatement();
        
        System.out.println("start doing statement.execute");
        
        statement.execute(
                "insert into moobar values(" +
                "'this SQL statement fails, and it " +
                "is gobbled up by the catch, okfine'); ");
     
        //The above line throws an exception because we try to cram
        //A string into an Int.  I Expect this, what happens is we gobble 
        //the Exception and ignore it like nothing is wrong.
        //But remember, we are in a TRANSACTION!  so keep reading.

        System.out.println("statement.execute done");
        
        statement.close();
        
    }
    catch (SQLException sqle)
    {
        System.out.println("keep on truckin, keep using " +
                "the last connection because what could go wrong?");
    }
    
    try{
        Statement statement = connection.createStatement();
        
        statement.executeQuery("select * from moobar");

        //This SQL is correctly formed, yet it throws the 
        //'transaction is aborted' SQL Exception, why?  Because:
        //A.  you were in a transaction.
        //B.  You ran a SQL statement that failed.
        //C.  You didn't do a rollback or commit on the affected connection.
        
    }
    catch (SQLException sqle)
    {
        sqle.printStackTrace();
    }   

}

Kode di atas menghasilkan keluaran ini untuk saya:

start doing statement.execute

keep on truckin, keep using the last connection because what could go wrong?

org.postgresql.util.PSQLException: 
  ERROR: current transaction is aborted, commands ignored until 
  end of transaction block

Solusi:

Anda memiliki beberapa opsi:

  1. Solusi paling sederhana:Jangan bertransaksi. Setel connection.setAutoCommit(false); ke connection.setAutoCommit(true); . Ini berfungsi karena SQL yang gagal diabaikan begitu saja sebagai pernyataan SQL yang gagal. Anda dipersilakan untuk mengabaikan pernyataan SQL semau Anda dan PostgreSQL tidak akan menghentikan Anda.

  2. Tetap berada dalam transaksi, tetapi ketika Anda mendeteksi bahwa SQL pertama gagal, lakukan rollback/re-start atau commit/restart transaksi. Kemudian Anda dapat terus gagal sebanyak mungkin kueri SQL pada koneksi database tersebut.

  3. Jangan tangkap dan abaikan Pengecualian yang dilontarkan saat pernyataan SQL gagal. Kemudian program akan berhenti pada kueri yang salah format.

  4. Dapatkan Oracle sebagai gantinya, Oracle tidak memberikan pengecualian saat Anda gagal melakukan kueri pada koneksi dalam suatu transaksi dan terus menggunakan koneksi itu.

Untuk membela keputusan PostgreSQL untuk melakukan hal-hal dengan cara ini... Oracle adalah membuat Anda lembut di tengah membiarkan Anda melakukan hal-hal bodoh dan mengabaikannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. File Soket /var/pgsql_socket/.s.PGSQL.5432 Hilang Di Mountain Lion (OS X Server)

  2. Panggilan untuk makalah untuk PGDay.IT 2011 telah diperpanjang

  3. Ubah semua catatan di postgres ke Titlecase, huruf besar pertama

  4. Dapatkan Ukuran Semua Basis Data di PostgreSQL (psql)

  5. Bagaimana menemukan tabel yang memiliki kolom tertentu di postgresql