sql >> Databasteknik >  >> RDS >> PostgreSQL

PSQLE Undantag:aktuell transaktion avbryts, kommandon ignoreras till slutet av transaktionsblocket

Jag fick det här felet när jag använde Java och PostgreSQL när jag infogade en tabell. Jag ska illustrera hur du kan återskapa detta fel:

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

Sammanfattning:

Anledningen till att du får det här felet är för att du har angett en transaktion och en av dina SQL-frågor misslyckades, och du slukade det felet och ignorerade det. Men det räckte inte, SEDAN använde du samma anslutning och använde SAMMA TRANSAKTION för att köra en annan fråga. Undantaget kastas på den andra, korrekt utformade frågan eftersom du använder en trasig transaktion för att utföra ytterligare arbete. PostgreSQL stoppar dig som standard från att göra detta.

Jag använder: 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-drivrutin är: postgresql-9.2-1000.jdbc4.jar

Använder Java-version: Java 1.7

Här är tabellen skapa-satsen för att illustrera undantaget:

CREATE TABLE moobar
(
    myval   INT
);

Java-program orsakar felet:

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

}

Koden ovan producerar denna utdata för 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ösningar:

Du har några alternativ:

  1. Enklaste lösningen:Var inte i en transaktion. Ställ in connection.setAutoCommit(false); till connection.setAutoCommit(true); . Det fungerar för då ignoreras den misslyckade SQL-satsen bara som en misslyckad SQL-sats. Du är välkommen att misslyckas med SQL-satser allt du vill och PostgreSQL kommer inte att stoppa dig.

  2. Fortsätt vara i en transaktion, men när du upptäcker att den första SQL-koden har misslyckats, antingen återställ/starta om eller commit/starta om transaktionen. Sedan kan du fortsätta att misslyckas med så många SQL-frågor på den databasanslutningen som du vill.

  3. Fånga och ignorera inte undantaget som skapas när en SQL-sats misslyckas. Då kommer programmet att stanna vid den felaktiga frågan.

  4. Skaffa Oracle istället, Oracle gör inget undantag när du misslyckas med en fråga på en anslutning inom en transaktion och fortsätter att använda den anslutningen.

Till försvar för PostgreSQL:s beslut att göra saker på det här sättet... var Oracle gör dig mjuk i mitten så att du kan göra dumma saker och förbise det.



  1. SQLAlchemy deklarativ:definiera utlösare och index (Postgres 9)

  2. Hur installerar man PDO-drivrutinen i php docker-bilden?

  3. Hur man skapar Not Null-begränsning på kolumn i SQL Server-tabell - SQL Server / T-SQL självstudie del 51

  4. Linux – PHP 7.0 och MSSQL (Microsoft SQL)