PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PSQLException:текущата транзакция е прекратена, командите се игнорират до края на блока на транзакцията

Получих тази грешка, използвайки Java и PostgreSQL, правейки вмъкване в таблица. Ще илюстрирам как можете да възпроизведете тази грешка:

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

Резюме:

Причината, поради която получавате тази грешка, е, че сте въвели транзакция и една от вашите 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

Ето изявлението за създаване на таблица, за да илюстрира изключението:

CREATE TABLE moobar
(
    myval   INT
);

Програмата Java причинява грешката:

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

}

Горещият код произвежда този изход за мен:

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

Решения:

Имате няколко опции:

  1. Най-простото решение:Не участвайте в транзакция. Задайте connection.setAutoCommit(false); към connection.setAutoCommit(true); . Работи, защото тогава неуспешният SQL просто се игнорира като неуспешен SQL израз. Можете да провалите SQL изрази колкото искате и PostgreSQL няма да ви спре.

  2. Останете в транзакция, но когато откриете, че първият SQL е неуспешен, или отменете/стартирайте отново, или ангажирайте/рестартирайте транзакцията. След това можете да продължите да проваляте толкова SQL заявки за тази връзка към базата данни, колкото искате.

  3. Не хващайте и игнорирайте изключението, което се хвърля, когато SQL израз се провали. След това програмата ще спре при неправилно формирана заявка.

  4. Вместо това вземете Oracle, Oracle не хвърля изключение, когато не успеете при заявка за връзка в рамките на транзакция и продължите да използвате тази връзка.

В защита на решението на PostgreSQL да прави нещата по този начин... Oracle бе прави те мек в средата, позволявайки ти да правиш глупости и го пренебрегваш.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL имена на процеси в Solaris

  2. Ден на разработчиците на PostgreSQL в Прага 2016 г

  3. Как да импортирате Heroku PG дъмп в локална машина

  4. Урок за PostgreSQL за начинаещи – всичко, което трябва да знаете за PostgreSQL

  5. postgresql генерира последователност без празнина