खोज…


लेनदेन शुरू करें

लेन-देन SQL बयानों का एक अनुक्रमिक समूह है जैसे कि चयन, सम्मिलित करें, अद्यतन करें या हटाएं, जो एक एकल कार्य इकाई के रूप में किया जाता है।

दूसरे शब्दों में, लेनदेन तब तक पूरा नहीं होगा जब तक कि समूह के भीतर प्रत्येक व्यक्तिगत ऑपरेशन सफल न हो। यदि लेन-देन के भीतर कोई भी संचालन विफल हो जाता है, तो संपूर्ण लेनदेन विफल हो जाएगा।

इसे समझाने के लिए बैंक लेनदेन सबसे अच्छा उदाहरण होगा। दो खातों के बीच स्थानांतरण पर विचार करें। इसे प्राप्त करने के लिए आपको SQL कथन लिखना होगा जो निम्न कार्य करता है

  1. पहले खाते में अनुरोधित राशि की उपलब्धता की जाँच करें
  2. डिडक्ट ने पहले खाते से राशि का अनुरोध किया
  3. इसे दूसरे खाते में जमा करें

यदि कोई भी ये प्रक्रिया विफल हो जाती है, तो पूरे को उनकी पिछली स्थिति में वापस कर दिया जाना चाहिए।

ACID: लेन-देन के गुण

लेन-देन में निम्नलिखित चार मानक गुण होते हैं

  • एटोमिसिटी: यह सुनिश्चित करता है कि कार्य इकाई के भीतर सभी ऑपरेशन सफलतापूर्वक पूरा हो गए हैं; अन्यथा, विफलता के बिंदु पर लेन-देन निरस्त कर दिया जाता है, और पिछले ऑपरेशनों को उनके पूर्व राज्य में वापस ले जाया जाता है।
  • संगति: यह सुनिश्चित करता है कि डेटाबेस सफलतापूर्वक रूप से प्रतिबद्ध लेनदेन पर राज्यों को बदलता है।
  • अलगाव: लेनदेन को स्वतंत्र रूप से संचालित करने और एक दूसरे के लिए पारदर्शी बनाने में सक्षम बनाता है।
  • स्थायित्व: यह सुनिश्चित करता है कि प्रतिबद्ध लेनदेन का परिणाम या प्रभाव एक सिस्टम विफलता के मामले में बना रहता है।

लेन-देन START TRANSACTION या BEGIN WORK साथ BEGIN WORK और एक COMMIT या ROLLBACK स्टेटमेंट के साथ समाप्त होता है। शुरुआत और अंत के बयानों के बीच एसक्यूएल लेनदेन का बड़ा हिस्सा है।

START TRANSACTION;
SET @transAmt = '500';
SELECT @availableAmt:=ledgerAmt FROM accTable WHERE customerId=1 FOR UPDATE;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=1;
UPDATE accTable SET ledgerAmt=ledgerAmt+@transAmt WHERE customerId=2;
COMMIT;

START TRANSACTION ट्रांसक्शन के साथ, ऑटोकॉमिट तब तक निष्क्रिय रहता है जब तक आप COMMIT या ROLLBACK साथ लेन-देन को समाप्त नहीं करते। ऑटोकॉमिट मोड तब अपनी पिछली स्थिति में बदल जाता है।

लेनदेन की अवधि के FOR UPDATE इंगित करता है (और लॉक करता है) पंक्ति।

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

लेन-देन में शामिल सामान्य प्रक्रियाएं

  • SQL कमांड BEGIN WORK या START TRANSACTION जारी करके लेनदेन शुरू करें।
  • अपने सभी SQL स्टेटमेंट चलाएं।
  • जांचें कि क्या सब कुछ आपकी आवश्यकता के अनुसार निष्पादित किया गया है।
  • यदि हाँ, तो COMMIT कमांड जारी करें, अन्यथा पिछले राज्य में सब कुछ वापस करने के लिए ROLLBACK आदेश जारी करें।
  • COMMIT बाद भी त्रुटियों की जाँच करें यदि आप उपयोग कर रहे हैं, या अंततः Galera / PXC का उपयोग कर सकते हैं।

संचार, रोलबैक और AUTOCOMMIT

AUTOCOMMIT

MySQL स्वचालित रूप से उन कथनों को बताता है जो लेनदेन का हिस्सा नहीं हैं। BEGIN या START TRANSACTION से पहले किसी भी UPDATE , DELETE या INSERT विवरण के परिणाम तुरंत सभी कनेक्शनों को दिखाई देंगे।

AUTOCOMMIT चर डिफ़ॉल्ट रूप से सही है। इसे निम्न तरीके से बदला जा सकता है,

--->To make autcommit false
SET AUTOCOMMIT=false;
--or
SET AUTOCOMMIT=0;

--->To make autcommit true
SET AUTOCOMMIT=true;
--or
SET AUTOCOMMIT=1;

AUTOCOMMIT स्थिति देखने के लिए

SELECT @@autocommit;

COMMIT

यदि AUTOCOMMIT गलत पर सेट है और लेन-देन नहीं हुआ है, तो परिवर्तन केवल वर्तमान कनेक्शन के लिए दिखाई देंगे।

COMMIT स्टेटमेंट टेबल में बदलाव करने के बाद, परिणाम सभी कनेक्शनों के लिए दिखाई देगा।

इसे समझाने के लिए हम दो कनेक्शनों पर विचार करते हैं

कनेक्शन 1

--->Before making autocommit false one row added in a new table
mysql> INSERT INTO testTable VALUES (1);

--->Making autocommit = false
mysql> SET autocommit=0;

mysql> INSERT INTO testTable VALUES (2), (3);    
mysql> SELECT * FROM testTable;
+-----+
| tId |
+-----+
|   1 |
|   2 |
|   3 |
+-----+

कनेक्शन 2

mysql> SELECT * FROM testTable;
+-----+
| tId |
+-----+
|   1 |
+-----+
---> Row inserted before autocommit=false only visible here

कनेक्शन 1

mysql> COMMIT;
--->Now COMMIT is executed in connection 1
mysql> SELECT * FROM testTable;
    +-----+
    | tId |
    +-----+
    |   1 |
    |   2 |
    |   3 |
    +-----+

कनेक्शन 2

mysql> SELECT * FROM testTable;
    +-----+
    | tId |
    +-----+
    |   1 |
    |   2 |
    |   3 |
    +-----+
--->Now all the three rows are visible here

ROLLBACK

यदि आपके क्वेरी निष्पादन में कुछ भी गलत हुआ है, तो परिवर्तनों को वापस करने के लिए ROLLBACK का उपयोग किया जाता है। नीचे स्पष्टीकरण देखें

--->Before making autocommit false one row added in a new table
mysql> INSERT INTO testTable VALUES (1);

--->Making autocommit = false
mysql> SET autocommit=0;

mysql> INSERT INTO testTable VALUES (2), (3);    
mysql> SELECT * FROM testTable;
+-----+
| tId |
+-----+
|   1 |
|   2 |
|   3 |
+-----+

अब हम ROLLBACK निष्पादित कर रहे हैं

--->Rollback executed now
mysql> ROLLBACk;

mysql> SELECT * FROM testTable;
+-----+
| tId |
+-----+
|   1 |
+-----+
--->Rollback removed all rows which all are not committed

एक बार जब COMMIT निष्पादित किया जाता है, तो ROLLBACK कुछ भी कारण नहीं होगा

mysql> INSERT INTO testTable VALUES (2), (3);    
mysql> SELECT * FROM testTable;
mysql> COMMIT;
+-----+
| tId |
+-----+
|   1 |
|   2 |
|   3 |
+-----+

--->Rollback executed now
mysql> ROLLBACk;

mysql> SELECT * FROM testTable;
+-----+
| tId |
+-----+
|   1 |
|   2 |
|   3 |
+-----+
--->Rollback not removed any rows

यदि AUTOCOMMIT सेट सत्य है, तभी COMMIT और ROLLBACK बेकार है

JDBC ड्राइवर का उपयोग कर लेनदेन

JDBC ड्राइवर का उपयोग करने वाले लेन-देन का उपयोग यह नियंत्रित करने के लिए किया जाता है कि लेनदेन कब और कैसे करना चाहिए। MySQL सर्वर से कनेक्शन JDBC ड्राइवर का उपयोग करके बनाया गया है

MySQL के लिए JDBC ड्राइवर को यहां डाउनलोड किया जा सकता है

JDBC ड्राइवर का उपयोग करके डेटाबेस से कनेक्शन प्राप्त करने की शुरुआत करें

Class.forName("com.mysql.jdbc.Driver");  
Connection con = DriverManager.getConnection(DB_CONNECTION_URL,DB_USER,USER_PASSWORD);
--->Example for connection url "jdbc:mysql://localhost:3306/testDB");

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

सर्वर से कनेक्शन बनाते समय इसका उल्लेख किया जाना चाहिए। तो कनेक्शन स्ट्रिंग की तरह होना चाहिए,

jdbc:mysql://localhost:3306/testDB?useUnicode=true&characterEncoding=utf8

चरित्र सेट और Collations के बारे में अधिक जानकारी के लिए इसे देखें

जब आप कनेक्शन खोलते हैं, तो AUTOCOMMIT मोड डिफ़ॉल्ट रूप से सही पर सेट होता है , जिसे लेन-देन शुरू करने के लिए गलत बदल दिया जाना चाहिए।

con.setAutoCommit(false);

कनेक्शन खोलने के बाद आपको हमेशा setAutoCommit() विधि को कॉल करना चाहिए।

अन्यथा नया लेन-देन शुरू करने के लिए START TRANSACTION या BEGIN WORK का उपयोग करें। का उपयोग करके START TRANSACTION या BEGIN WORK , परिवर्तन करने की कोई जरूरत AUTOCOMMIT झूठी। यह स्वचालित रूप से अक्षम हो जाएगा।

अब आप लेनदेन शुरू कर सकते हैं। नीचे एक पूर्ण JDBC लेनदेन उदाहरण देखें।

package jdbcTest;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;


public class accTrans {

    public static void doTransfer(double transAmount,int customerIdFrom,int customerIdTo) {

        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
 
        try {
            String DB_CONNECTION_URL = "jdbc:mysql://localhost:3306/testDB?useUnicode=true&characterEncoding=utf8";

            Class.forName("com.mysql.jdbc.Driver");  
            con = DriverManager.getConnection(DB_CONNECTION_URL,DB_USER,USER_PASSWORD);

            --->set auto commit to false
            con.setAutoCommit(false);
            ---> or use con.START TRANSACTION / con.BEGIN WORK

            --->Start SQL Statements for transaction
            --->Checking availability of amount
            double availableAmt    = 0;
            pstmt = con.prepareStatement("SELECT ledgerAmt FROM accTable WHERE customerId=? FOR UPDATE");
            pstmt.setInt(1, customerIdFrom);
            rs = pstmt.executeQuery();
            if(rs.next())
                availableAmt    = rs.getDouble(1);

            if(availableAmt >= transAmount)
            {
                ---> Do Transfer
                ---> taking amount from cutomerIdFrom
                pstmt = con.prepareStatement("UPDATE accTable SET ledgerAmt=ledgerAmt-? WHERE customerId=?");                        
                pstmt.setDouble(1, transAmount);
                pstmt.setInt(2, customerIdFrom);
                pstmt.executeUpdate();

                ---> depositing amount in cutomerIdTo
                pstmt = con.prepareStatement("UPDATE accTable SET ledgerAmt=ledgerAmt+? WHERE customerId=?");                        
                pstmt.setDouble(1, transAmount);
                pstmt.setInt(2, customerIdTo);
                pstmt.executeUpdate();

                con.commit();
            }
            --->If you performed any insert,update or delete operations before 
            ----> this availability check, then include this else part
            /*else { --->Rollback the transaction if availability is less than required
                con.rollback();
            }*/

        } catch (SQLException ex) {
            ---> Rollback the transaction in case of any error
            con.rollback();
        } finally {
            try {
                if(rs != null)  rs.close();
                if(pstmt != null) pstmt.close();
                if(con != null) con.close();
            }
        }
    }
 
    public static void main(String[] args) {
        doTransfer(500, 1020, 1021);
        -->doTransfer(transAmount, customerIdFrom, customerIdTo);
    }
}

JDBC लेनदेन सुनिश्चित करें कि ट्रांजेक्शन ब्लॉक के भीतर सभी SQL स्टेटमेंट्स सफल हैं, यदि ट्रांजैक्शन ब्लॉक के भीतर SQL स्टेटमेंट में से कोई एक भी फेल है, तो ट्रांजेक्शन ब्लॉक के भीतर सबकुछ खत्म कर दें और रोलबैक करें।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow