Получих тази грешка, използвайки 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
Решения:
Имате няколко опции:
-
Най-простото решение:Не участвайте в транзакция. Задайте
connection.setAutoCommit(false);
къмconnection.setAutoCommit(true);
. Работи, защото тогава неуспешният SQL просто се игнорира като неуспешен SQL израз. Можете да провалите SQL изрази колкото искате и PostgreSQL няма да ви спре. -
Останете в транзакция, но когато откриете, че първият SQL е неуспешен, или отменете/стартирайте отново, или ангажирайте/рестартирайте транзакцията. След това можете да продължите да проваляте толкова SQL заявки за тази връзка към базата данни, колкото искате.
-
Не хващайте и игнорирайте изключението, което се хвърля, когато SQL израз се провали. След това програмата ще спре при неправилно формирана заявка.
-
Вместо това вземете Oracle, Oracle не хвърля изключение, когато не успеете при заявка за връзка в рамките на транзакция и продължите да използвате тази връзка.
В защита на решението на PostgreSQL да прави нещата по този начин... Oracle бе прави те мек в средата, позволявайки ти да правиш глупости и го пренебрегваш.