sql >> Database teknologi >  >> RDS >> PostgreSQL

PSQLEundtagelse:nuværende transaktion afbrydes, kommandoer ignoreret indtil slutningen af ​​transaktionsblok

Jeg fik denne fejl ved at bruge Java og PostgreSQL ved at lave en indsættelse på en tabel. Jeg vil illustrere, hvordan du kan genskabe denne fejl:

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

Oversigt:

Grunden til at du får denne fejl, er fordi du har indtastet en transaktion og en af ​​dine SQL-forespørgsler mislykkedes, og du slugte den fejl og ignorerede den. Men det var ikke nok, SÅ brugte du den samme forbindelse og brugte SAMME TRANSAKTION til at køre en anden forespørgsel. Undtagelsen bliver kastet på den anden, korrekt dannede forespørgsel, fordi du bruger en brudt transaktion til at udføre yderligere arbejde. PostgreSQL forhindrer dig som standard i at gøre dette.

Jeg bruger: 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".

Min PostgreSQL-driver er: postgresql-9.2-1000.jdbc4.jar

Brug af Java-version: Java 1.7

Her er tabellen oprette erklæring for at illustrere undtagelsen:

CREATE TABLE moobar
(
    myval   INT
);

Java-program forårsager fejlen:

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();
    }   

}

Ovenstående kode producerer dette output for mig:

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

Løsninger:

Du har et par muligheder:

  1. Den enkleste løsning:Vær ikke i en transaktion. Indstil connection.setAutoCommit(false); til connection.setAutoCommit(true); . Det virker, fordi så bliver den fejlslagne SQL bare ignoreret som en fejlslagen SQL-sætning. Du er velkommen til at fejle SQL-sætninger, alt hvad du vil, og PostgreSQL vil ikke stoppe dig.

  2. Bliv ved med at være i en transaktion, men når du opdager, at den første SQL er fejlet, skal du enten rulle tilbage/genstarte eller foretage/genstarte transaktionen. Så kan du fortsætte med at fejle så mange SQL-forespørgsler på den databaseforbindelse, som du ønsker.

  3. Fang og ignorer ikke undtagelsen, der vises, når en SQL-sætning fejler. Så stopper programmet på den forkerte forespørgsel.

  4. Få Oracle i stedet, Oracle kaster ikke en undtagelse, når du fejler en forespørgsel på en forbindelse i en transaktion og fortsætter med at bruge den forbindelse.

Til forsvar for PostgreSQL's beslutning om at gøre tingene på denne måde... var Oracle gør dig blød i midten, så du kan lave dumme ting og overse det.



  1. Hvordan får jeg adgang til Oracle fra Python?

  2. Sådan opretter du en pivot-forespørgsel i sql-server uden aggregeret funktion

  3. Psql kunne ikke oprette forbindelse til serveren:Ingen sådan fil eller mappe, 5432 fejl?

  4. Returner en liste over tidszoner, der understøttes af PostgreSQL