2013-02-22 5 views
6

मैं जावा जेडीबीसी के लिए नया हूं, और छोटे डेटाबेस एप्लिकेशन विकसित किया है। मैं
O'Reilly से सीख रहा हूं - जेडीबीसी और जावा 2 संस्करण के साथ डेटाबेस प्रोग्रामिंग।जेडीबीसी: क्या 'con.rollback()' केवल तभी प्रभावी होता है जब'con.commit` सफल न हो?

con.rollback() है केवल con.commit सफल नहीं हुआ है?

वास्तव में मुझे लगता है कि कि बुला con.rollback() उसके प्रभाव भले ही con.commit() सफल रहा है। इसका मतलब है कि इसे 'पूर्ववत करें' एक्शन के रूप में उपयोग करना।

con.commit() के बाद मैंने con.rollback() पर कॉल करने का प्रयास किया, लेकिन यह अनुमान लगाया गया है कि यह अनुमान लगाया नहीं गया है। तो क्या यह ठीक है/अपेक्षित है?

con.rollback() बाहर टिप्पणी की है:

यह उदाहरण पुस्तक मैं उपर्युक्त से है। यह con.close() से पहले के अंत में है। इसे असम्बद्ध करने का प्रयास करें। con.rollback()con.commit() सफल होने के बाद चीजों को वापस नहीं लाता है।

import java.sql.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class UpdateLogic 
{ 

    public static void main(String args[]) 
    { 
     Connection con = null; 

     try 
     { 
      String driver = "com.mysql.jdbc.Driver"; 
      Class.forName(driver).newInstance(); 
      String url = "jdbc:mysql://localhost:3306/Company"; 
      Statement s; 
      con = DriverManager.getConnection(url, "root", ""); 
      con.setAutoCommit(false); // make sure auto commit is off! 
      s = con.createStatement();// create the first statement 
      s.executeUpdate("INSERT INTO employee VALUES ('1', 'employee 1', '22','00-1234')"); 

      s.close(); // close the first statement 
      s = con.createStatement(); // create the second statement 
      s.executeUpdate("INSERT INTO employee VALUES ('2', 'employee 2', '21','00_4321')"); 

      con.commit(); // commit the two statements 
      System.out.println("Insert succeeded."); 
      s.close(); // close the second statement 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) 
     { 
      Logger.getLogger(UpdateLogic.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (SQLException e) 
     { 
      if (con != null) 
      { 
       try 
       { 
        con.rollback(); 
       } // rollback on error 
       catch (SQLException i) 
       { 
       } 
      } 
      e.printStackTrace(); 
     } finally 
     { 
      if (con != null) 
      { 
       try 
       { 
        //con.rollback(); 
        con.close(); 
       } catch (SQLException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+2

आप जो पूछ रहे हैं उसे बनाना मुश्किल है। यदि कोई प्रतिबद्धता सफल होती है तो यह पूरा हो जाता है, पूरा हो जाता है, आप उस बिंदु पर इसे वापस नहीं रोल कर सकते हैं। 'प्रतिबद्ध 'विधि को कॉल करने से पहले आपको रोलबैक *** के लिए लेनदेन को चिह्नित करना होगा। – Perception

उत्तर

9

जब आप commit() पर कॉल करते हैं, तो आप वर्तमान लेनदेन को पूरा/बंद करते हैं। इस प्रकार, चूंकि rollback() वर्तमान लेनदेन में किसी भी बदलाव को रोकता है (जावाडोक के अनुसार), यह प्रभावी ढंग से कुछ भी नहीं करेगा।

3

क्या con.rollback() केवल तभी प्रभावी होता है जब con.commit सफल न हो?

हाँ और यह भी प्रभाव पड़ता है अगर आप इसे con.commit से पहले कहते हैं। और शर्त है कि कनेक्शन की autocommit मोड con.setAutoCommit(false)
किसी भी लेन-देन है कि आप के साथ con.setAutoCommit(false) तक con.commit() कहा जाता है डेटाबेस के लिए प्रतिबद्ध नहीं है JDBC का उपयोग कर DML एसक्यूएल प्रश्नों का उपयोग कर डेटाबेस में बनाने का उपयोग कर झूठी होना चाहिए। डेटाबेस में आपके द्वारा किए गए नवीनतम प्रतिबद्ध लेन-देन उस कनेक्शन के लिए savepoint के रूप में कार्य करता है। जब आप con.rollback() पर कॉल करते हैं तो आपने savepoint के बाद किए गए सभी लेनदेन को पूर्ववत कर दिया है। अगर con.commit() पर कॉल करते समय कुछ अपवाद होता है, तो इसका मतलब है कि लेनदेन डेटाबेस में सहेजे नहीं जाते हैं। con.commit() विफल होने पर catch कथन में con.rollback() पर कॉल करना एक अच्छा अभ्यास है।

+0

सेवपॉइंट्स एक अलग लेकिन संबंधित अवधारणा है: सेवपॉइंट्स एक लेनदेन के अंदर हैं और आपको लेन-देन में अंक चिह्नित करने की अनुमति देता है जिसे आप पूरे लेन-देन को दोबारा बिना रोलबैक कर सकते हैं। –

+0

@MarkRotteveel: तो मैंने अपनी पोस्ट में जो कुछ बताया है उससे अलग कैसे है? –

+0

अंतर यह है कि आपके पास सक्रिय लेनदेन के अंदर एक या अधिक सेवपॉइंट्स हो सकते हैं। –

संबंधित मुद्दे