PSQLException: वर्तमान लेन-देन निरस्त कर दिया जाता है, आदेशों को लेन-देन ब्लॉक के अंत तक अनदेखा कर दिया जाता है


161

मैं JBoss 7.1.1 फाइनल के सर्वर.लॉग फ़ाइल में निम्न (छंटनी) स्टैकट्रेस देख रहा हूं:

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

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
at org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection$StatementHandler.invoke(AbstractJdbc23PooledConnection.java:455)
at $Proxy49.executeUpdate(Unknown Source)   at org.jboss.jca.adapters.jdbc.WrappedStatement.executeUpdate(WrappedStatement.java:371)
at org.infinispan.loaders.jdbc.TableManipulation.executeUpdateSql(TableManipulation.java:154) [infinispan-cachestore-jdbc-5.1.2.FINAL.jar:5.1.2.FINAL]
... 154 more

पोस्टग्रेज लॉग फाइल का निरीक्षण करने से निम्नलिखित कथनों का पता चलता है:

STATEMENT:  SELECT count(*) FROM ISPN_MIXED_BINARY_TABLE_configCache
ERROR:  current transaction is aborted, commands ignored until end of transaction block
STATEMENT:  CREATE TABLE ISPN_MIXED_BINARY_TABLE_configCache(ID_COLUMN VARCHAR(255) NOT NULL, DATA_COLUMN BYTEA, TIMESTAMP_COLUMN BIGINT, PRIMARY KEY (ID_COLUMN))
ERROR:  relation "ispn_mixed_binary_table_configcache" does not exist at character 22

मैं JBoss 7.1.1 फाइनल के साथ भेजे गए Infinispan का उपयोग कर रहा हूं, जो 5.1.2.Final है।

तो यह वही है जो मुझे लगता है कि हो रहा है:

  • SELECT count(*)...यदि कोई रिकॉर्ड हैं, तो यह देखने के लिए इंफिनस्पैन स्टेटमेंट चलाने का प्रयास करता है ISPN_MIXED_BINARY_TABLE_configCache;
  • किसी कारण से पोस्टग्रैज, इस कथन को पसंद नहीं करता है।
  • Infinispan इस पर ध्यान नहीं देता है और CREATE TABLEबयान के साथ आगे की प्रतिज्ञा करता है
  • बारफॉर्स को पोस्ट करें क्योंकि यह अभी भी सोचता है कि यह वही लेन-देन है, जिसे इन्फिनस्पैन वापस रोल करने में विफल रहा है, और यह लेन-देन पहले SELECT count(*)...बयान से शाफ़्ट है ।

इस त्रुटि का क्या मतलब है और किसी भी विचार को कैसे काम करना है?


बस अगर आप की तरह मेरे ऊपर के लिए खोज यहाँ आया PSQLException: current transaction is aborted...( 25P02) और शायद यह भी JPAया Hibernate। अंत में यह हमारे (अच्छा!) लॉग-इन उपयोग के toString()कारण एक-- लोड किए गए डीएओ ऑब्जेक्ट के साथ खिलाया गया था जो त्रुटि का कारण था और अच्छी तरह से निगल लिया गया था (लेकिन मेरे द्वारा किसी का ध्यान नहीं दिया गया): log.info( "bla bla: {}", obj )उत्पादित bla bla: [FAILED toString()]। इसे बदलकर इसे log.info( "bla bla: {}", String.valueOf( obj )शून्य-सुरक्षित बना दिया गया है, लेकिन इसे निगल नहीं लिया गया है और इस प्रकार लेनदेन को असंबंधित क्वेरी पर विफल हो रहा है।
एंड्रियास डिट्रीच

मुझे एक ही प्रकार की त्रुटि हो रही थी। मुझे sql से पहले कनेक्शन जारी करना था। मेरा कोड कनेक्शन था
। Com

जवाबों:


210

मुझे यह त्रुटि मिली जावा और 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 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

समाधान:

आपके पास कुछ विकल्प हैं:

  1. सरलतम समाधान: लेन-देन में न हों। सेट connection.setAutoCommit(false);करने के लिए connection.setAutoCommit(true);। यह काम करता है क्योंकि तब विफल SQL को केवल विफल SQL कथन के रूप में अनदेखा किया जाता है। SQL कथन को विफल करने के लिए आप सभी का स्वागत करते हैं और PostgreSQL आपको रोक नहीं पाएगा।

  2. लेन-देन में बने रहें, लेकिन जब आपको पता चलता है कि पहली SQL विफल हो गई है, या तो रोलबैक / री-स्टार्ट या कमिट / ट्रांजेक्शन पुनः आरंभ करें। फिर आप उस डेटाबेस कनेक्शन पर जितने चाहें उतने SQL क्वेरी को विफल करना जारी रख सकते हैं।

  3. SQL कथन विफल होने पर फेंके गए अपवाद को न पकड़ें और अनदेखा न करें। तब प्रोग्राम विकृत क्वेरी पर रुक जाएगा।

  4. इसके बजाय ओरेकल प्राप्त करें, ओरेकल एक अपवाद को फेंक नहीं देता है जब आप किसी लेन-देन के भीतर कनेक्शन पर एक प्रश्न को विफल करते हैं और उस कनेक्शन का उपयोग करना जारी रखते हैं।

इस तरह से चीजों को करने के PostgreSQL के फैसले के बचाव में ... ओरेकल बीच में आपको नरम बना रहा था जिससे आप गूंगा सामान और इसे अनदेखी कर रहे थे।


11
Lol @ विकल्प 4 ... मैंने ओरेकल में काफी विकास किया था, और हाल ही में Postgres का उपयोग करना शुरू कर दिया है ... यह वास्तव में कष्टप्रद है कि Postgres ऐसा करता है, और अब हमें वास्तव में हमारे कार्यक्रम के एक बड़े थोक को फिर से लिखना होगा Oracle से Postgres में पोर्ट कर रहे हैं। ऑरेकल जैसा व्यवहार करने के लिए पहले जैसा कोई विकल्प क्यों नहीं है, लेकिन ऑटो-कमिट के बिना ?
ADTC 4

3
कुछ परीक्षणों के बाद पता चला कि विकल्प 2 निकटतम है जो आप ओरेकल व्यवहार के लिए प्राप्त कर सकते हैं। यदि आपको कई अपडेट जारी करने की आवश्यकता है, और एक विफलता बाद के अपडेट को रोकना नहीं चाहिए, तो बस पकड़े जाने rollback()पर कॉल करें । [ वैसे भी मैंने महसूस किया कि यह सब कुछ स्पष्ट करने के लिए उपयोगकर्ता को मजबूर करने के लिए PostgreSQL दर्शन के अनुरूप है, जबकि ओरेकल के पास बहुत सारी चीजों का ध्यान रखना है।]ConnectionSQLException
ADTC

3
विकल्प 2 में असंभव शाखा है or commit/restart the transaction। जैसा कि मैं देख सकता हूं कि अपवाद के बाद प्रतिबद्ध होने का कोई तरीका नहीं है। जब मैं कमिट करने की कोशिश करता हूं - PostgreSQL करते हैंrollback
पगड़ी

1
मैं @turbanoff द्वारा उठाए गए समस्या की पुष्टि कर सकता हूं। यह भी सीधे के साथ पुन: पेश किया जा सकता है psql। (1) लेनदेन शुरू करें, (2) कुछ मान्य स्टेटमेंट जारी करें, (3) अमान्य स्टेटमेंट जारी करें, (4) कमिट -> साइकल कमिट करने के बजाय रोलबैक करेगा।
अल्फा

2
postgresql.org/message-id/op.ur57x9ue33x80h%40insanity.lain.pl इस विषय की एक रोचक चर्चा। यदि इस समस्या को एक बाधा उल्लंघन से ट्रिगर किया जाता है, तो PostgreSQL devs समय से पहले संघर्ष के लिए जाँच करने की सलाह देते हैं (अपडेट / इंसर्ट करने से पहले क्वेरी) या savepointsअपडेट / इंसर्ट से पहले बिंदु पर वापस जाने के लिए उपयोग करते हैं । नमूना कोड के लिए stackoverflow.com/a/28640557/14731 देखें ।
गिली

30

उत्पादन की जाँच से पहले यह बयान कि वजह से current transaction is aborted। आम तौर पर इसका मतलब है कि डेटाबेस ने एक अपवाद को फेंक दिया था जिसे आपके कोड ने अनदेखा कर दिया था और अब अगले प्रश्नों की उम्मीद कर कुछ डेटा वापस कर रहा था।

तो अब आपके पास आपके एप्लिकेशन के बीच एक स्टेट मिसमैच है, जो समझता है कि चीजें ठीक हैं, और डेटाबेस, जिसके लिए आपको रोलबैक करना होगा और शुरुआत से अपने लेनदेन को फिर से शुरू करना होगा।

आपको ऐसे मामलों में सभी अपवादों और रोलबैक लेनदेन को पकड़ना चाहिए।

यहाँ एक ऐसा ही मुद्दा है।


यह बहुत अच्छा है, इस मामले को छोड़कर, यह एक 3-पार्टी लाइब्रेरी इंफिनस्पैन होगा, जो पोस्टग्रेज की बात कर रहा है, न कि मेरा कोड।
जिम '15

खैर, स्थिति अभी भी वही है - लेन-देन को वापस रोल करना होगा। हो सकता है कि जाँच करें कि आपके द्वारा उपयोग किए जा रहे पुस्तकालय का नया संस्करण है या उनके बग ट्रैकर में समस्या बढ़ गई है। यदि आपको SQLवह समस्या मिल जाएगी जो समस्या का कारण है, तो आपके पास PostgreSQL एक्स्टेंसिबिलिटी का उपयोग करके समस्या को समाप्त करने के लिए कुछ क्षेत्र होंगे।
वायगोरोव

ऐसा लगता है जैसे आपने मेरे संदेह की पुष्टि कर दी है - मैं अब इन्फिनिसन 5.1.2 स्रोत को देखने जा रहा हूं।
जिमी

निष्पक्ष होने के लिए, TableManipulation वर्ग में, चुनिंदा गिनती (*) को चलाने के प्रयास के चारों ओर एक कोशिश-पकड़ है .... शायद पोस्टग्रैज चालक अपेक्षित अपवादों में से एक को नहीं फेंक रहा है। मैं JBoss को अधिक जानने के लिए प्रयास करने के लिए डिबगर को हुक करूंगा।
जिमी

इस बग में इनफ़िनस्पैन कोड का सुझाव दिया गया था: issues.jboss.org/browse/… मैंने इसे एक डीबगर संलग्न किया है जो कि लाइव JBoss 7.1.1 उदाहरण पर चल रहा है और Postgres सही स्थानों पर अपवादों को फेंक रहा है। शायद यह JdbcUtil.safeClose () कथन हैं जो अपना काम नहीं कर रहे हैं। मैं इसे Infinispan के साथ बढ़ाऊंगा।
जिम '16

16

मुझे लगता है कि सबसे अच्छा समाधान का उपयोग करना है java.sql.Savepoint

इससे पहले कि आप किसी क्वेरी को निष्पादित कर सकें throw SQLException, जो विधि का उपयोग कर सकती है , Connection.setSavepoint()और यदि कोई अपवाद फेंका जाता है, तो आप केवल इस बचत को रोलबैक करते हैं, न कि पूरे लेनदेन का।

उदाहरण कोड:

Connection conn = null;
Savepoint savepoint = null;
try {
    conn = getConnection();
    savepoint = conn.setSavepoint();
    //execute some query
} catch(SQLException e) {
    if(conn != null && savepoint != null) {
        conn.rollback(savepoint);
    }
} finally {
   if(conn != null) {
      try {
          conn.close();
      } catch(SQLException e) {}

   }
}

मैं गलती से किसी तरह नीचे उतरा, केवल देखा। जानबूझकर नहीं किया गया था, जब तक जवाब संपादित नहीं किया जाता है, मैं पूर्ववत नहीं कर सकता।
cerberos

1
Savepoint तरीका वास्तविक समाधान है। PHP, Doctrine2 और Postgres (9.5) के वातावरण में भी मेरे लिए काम करता है। धन्यवाद
helvete

7

वहाँ कुछ काम PostgreSQL JDBC ड्राइवर पर किया, इस व्यवहार से संबंधित हो गया है:
देखने https://github.com/pgjdbc/pgjdbc/pull/477

यह संभव है, सेटिंग करके

स्वतः सहेजना = हमेशा
कनेक्शन में ( वर्तमान लेनदेन को निरस्त कर दिया गया है) सिंड्रोमा से बचने के लिए ( https://jdbc.postgresql.org/documentation/head/connect.html देखें )।
ओवरहेड को स्टेटमेंट एक्जीक्यूशन के आसपास एक सेवपॉइंट संभालने के कारण बहुत कम रखा गया है (विवरण के लिए ऊपर लिंक देखें)।


5

रूबी ऑन रेल्स पीजी में, मैंने एक माइग्रेशन बनाया था, अपने डीबी को माइग्रेट किया था, लेकिन अपने विकास सर्वर को फिर से शुरू करना भूल गया। मैंने अपना सर्वर फिर से शुरू किया और यह काम कर गया।


यही हाल मेरा भी था। सोचा कि यह कुछ बेवकूफ होना चाहिए, क्योंकि मैं वास्तव में कुछ भी करने की कोशिश नहीं करता था जो जटिल है।
Tashows

4

इस त्रुटि का कारण यह है कि वर्तमान डेटाबेस ऑपरेशन के लिए गलत संचालन से पहले अन्य डेटाबेस हैं, to मैं अपने चीनी को अंग्रेजी में अनुवाद करने के लिए Google अनुवाद का उपयोग नहीं कर सकता)


3

आपको रोलबैक करने की आवश्यकता है। JDBC पोस्टग्रैज ड्राइवर काफी खराब है। लेकिन अगर आप अपने लेन-देन को बनाए रखना चाहते हैं, और उस त्रुटि को केवल रोलबैक करते हैं, तो आप बचत का उपयोग कर सकते हैं:

try {
_stmt = connection.createStatement();
_savePoint = connection.setSavepoint("sp01");
_result = _stmt.executeUpdate(sentence) > 0;
} catch (Exception e){
 if (_savePoint!=null){
 connection.rollback(_savePoint);
}
}

यहाँ और पढ़ें:

http://www.postgresql.org/docs/8.1/static/sql-savepoint.html



2

मेरे पास एक ही मुद्दा था लेकिन फिर एहसास हुआ कि डेटाबेस में समान नाम वाली एक तालिका है। हटाने के बाद मैं फ़ाइल आयात करने में सक्षम था।


यह मेरा मुद्दा था, मेरे लिए टेबल दो अलग-अलग स्कीमाओं में थीं।
टमाटर

0

यह PostgreSQL का बहुत ही अजीब व्यवहार है, यह "सब कुछ स्पष्ट करने के लिए उपयोगकर्ता को मजबूर करने के PostgreSQL दर्शन के अनुरूप" भी नहीं है - जैसा कि अपवाद को पकड़ा गया था और स्पष्ट रूप से अनदेखा किया गया था। इसलिए यह रक्षा भी नहीं करता है। इस मामले में ओरेकल बहुत अधिक उपयोगकर्ता के अनुकूल व्यवहार करता है और (मेरे लिए) सही ढंग से - यह डेवलपर के लिए एक विकल्प छोड़ देता है।


0

यदि आप वॉल्यूम पर डिस्क स्थान से बाहर हैं, तो ऐसा हो सकता है।


मुझे लगता है कि यह सबसे आम कारण नहीं है, लेकिन यह एक सर्वर पर मामला था जिसे मुझे समस्या निवारण के लिए कहा गया था। इसलिए मुझे लगता है कि इसे संभावित कारण के रूप में सूचीबद्ध किया जाना चाहिए।
gregb

0

मैं सिर्फ उसी त्रुटि का सामना करता हूं। मैं अपने स्थानीय PostgreSQL में log_statement और log_min_error_statement को सक्षम करके मूल कारण का पता लगाने में सक्षम था ।

मैंने इसे संदर्भित किया


0

मैं पोस्टग्रेज के साथ JDBI का उपयोग कर रहा हूं, और पिछली समस्या के एक बयान से कुछ अड़चनों के उल्लंघन के बाद, उसी समस्या का सामना करना पड़ा, बाद के कथन विफल हो जाएंगे (लेकिन मैं थोड़ी देर प्रतीक्षा करने के बाद, 20-30 सेकंड का कहना है, समस्या दूर हो जाती है )।

कुछ शोध के बाद, मैंने पाया कि समस्या यह थी कि मैं अपने JDBI में "मैन्युअल रूप से" लेन-देन कर रहा था, यानी मैंने BEGIN के अपने बयानों को घेर लिया है; ... COMMIT; और यह अपराधी निकला!

JDBI v2 में, मैं सिर्फ @ ट्रांसलेशन टिप्पणी जोड़ सकता हूं, और @SqlQuery या @SqlUpdate के भीतर स्टेटमेंट को लेनदेन के रूप में निष्पादित किया जाएगा, और उपर्युक्त समस्या कोई और नहीं होती है!


0

मेरे मामले में मुझे यह त्रुटि आ रही थी क्योंकि मेरी फ़ाइल भ्रष्ट थी। फाइलों के रिकॉर्ड को पुनरावृत्त करते समय यह मुझे वही त्रुटि दे रहा था।

भविष्य में यह किसी को भी मदद करेगा। यह उत्तर पोस्ट करने का एकमात्र कारण है।


0

मैं वसंत का उपयोग करता हूं @Transactional एनोटेशन के , और मैं अपवाद को पकड़ता हूं और कुछ अपवाद के लिए मैं 3 बार पुन: प्रयास करूंगा।

Posgresql के लिए, जब अपवाद मिला, तो आप किसी भी अधिक के लिए एक ही कनेक्शन का उपयोग नहीं कर सकते। आपको पहले रोलबैक करना होगा।

मेरे मामले के लिए, मैं DatasourceUtilsवर्तमान कनेक्शन प्राप्त करने और connection.rollback()मैन्युअल रूप से कॉल करने के लिए उपयोग करता हूं । और कॉल करने की विधि को पुनः प्रयास करें।


0

मैं स्प्रिंग बूट जपा के साथ काम कर रहा था और @EnableTransactionManagement लागू करके तय किया गया था

संलग्न फ़ाइल आपकी मदद कर सकती है।यहाँ छवि विवरण दर्ज करें


0

मैं स्प्रिंग बूट जपा के साथ काम कर रहा था और @EnableTransactionManagement लागू करके तय किया गया था

संलग्न फ़ाइल आपकी मदद कर सकती है।


0

इसे इस्तेमाल करे COMMIT;

मुझे लगता है कि pgadmin4 में चलाते हैं। यह मदद कर सकता है। यह समय से पहले पिछले कमांड को रोकने के साथ करना है


-1

प्रतिबद्ध पढ़ने के लिए दोहराने योग्य पढ़ने से अलगाव स्तर बदलें।


-1

Con.setAutoCommit (गलत) को con.setAutoCommit (सत्य) पर सेट करें

नया आरंभ करने से पहले लेनदेन करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.