मुझे यह त्रुटि जावा और पोस्टग्रेएसक्यूएल का उपयोग करके एक टेबल पर इंसर्ट करते हुए मिली है। मैं समझाऊंगा कि आप इस त्रुटि को कैसे पुन:उत्पन्न कर सकते हैं:
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 1.7
अपवाद को दर्शाने के लिए टेबल क्रिएट स्टेटमेंट यहां दिया गया है:
CREATE TABLE moobar
(
myval INT
);
जावा प्रोग्राम त्रुटि का कारण बनता है:
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 था आपको बीच-बीच में नर्म बनाता है और आपको बेवकूफी भरा काम करने देता है और उसे नज़रअंदाज़ कर देता है।