Transactions
Commit और rollback
Transactions, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
लेन-देन क्या है
लेन-देन कई एसक्यूएल क्रियाओं को एक ऐसी इकाई में समूहित करता है जिसमें या तो सब कुछ होता है या कुछ भी नहीं।
या तो हर कथन सफल होता है और परिवर्तन स्थायी कर दिए जाते हैं (पुष्टि), या कुछ विफल हो जाता है और सभी परिवर्तन वापस कर दिए जाते हैं (पलटाव)। इससे डेटाबेस संगत बना रहता है।
एक मिनट में ACID
लेन-देन ACID की गारंटी प्रदान करते हैं:
- परमाण्विकता — सब कुछ या कुछ भी नहीं।
- संगतता — डेटाबेस को एक मान्य स्थिति से दूसरी मान्य स्थिति में ले जाना।
- पृथक्करण — समवर्ती लेन-देन एक-दूसरे के डेटा को दूषित नहीं करते।
- स्थायित्व — एक बार पुष्टि हो जाने पर, दुर्घटना के बाद भी परिवर्तन सुरक्षित रहते हैं।
स्वचालित-पुष्टि मोड
पूर्वनिर्धारित रूप से जेडीबीसी कनेक्शन स्वचालित-पुष्टि मोड में चलते हैं: हर कथन अपना अलग लेन-देन होता है और तुरंत स्थायी कर दिया जाता है।
एकल कथनों के लिए यह ठीक है, लेकिन जब कई लेखन कार्यों का एक साथ सफल होना आवश्यक हो, तब यह उपयोगी नहीं है। लेन-देन को स्वयं नियंत्रित करने के लिए स्वचालित-पुष्टि बंद करें।
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/bank";
try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
System.out.println("Default auto-commit: " + conn.getAutoCommit());
conn.setAutoCommit(false);
System.out.println("Now manual: " + conn.getAutoCommit());
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}पुष्टि और पलटाव
स्वचालित-पुष्टि बंद होने पर, सीमाएँ आप तय करते हैं:
conn.commit()सभी लंबित परिवर्तनों को स्थायी कर देता है।conn.rollback()उन्हें निरस्त कर देता है।
इसका पारंपरिक उदाहरण धन हस्तांतरण है: एक खाते से राशि घटाना और दूसरे खाते में जमा करना। दोनों कार्य होने चाहिए, या फिर कोई भी नहीं।
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/bank";
String debit = "UPDATE account SET balance = balance - ? WHERE id = ?";
String credit = "UPDATE account SET balance = balance + ? WHERE id = ?";
try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
conn.setAutoCommit(false);
try (PreparedStatement d = conn.prepareStatement(debit);
PreparedStatement c = conn.prepareStatement(credit)) {
d.setInt(1, 100); d.setInt(2, 1); d.executeUpdate();
c.setInt(1, 100); c.setInt(2, 2); c.executeUpdate();
conn.commit();
System.out.println("Transfer committed");
} catch (SQLException ex) {
conn.rollback();
System.out.println("Rolled back: " + ex.getMessage());
}
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}विफलता पर पलटाव का प्रतिरूप
याद रखने योग्य ढाँचा:
- स्वचालित-पुष्टि बंद करें।
- काम को अंदरूनी
tryके भीतर करें। - सफलता पर
commit()कॉल करें। catchमेंrollback()कॉल करें और त्रुटि फिर से भेजें या दर्ज करें।
पलटाव के बिना, कोई विफलता डेटाबेस को आधा-अधूरा अद्यतन छोड़ सकती है।
परमाण्विकता का अनुकरण
यहाँ सब-कुछ-या-कुछ-भी-नहीं का विचार स्वतंत्र रूप से चलने वाले सादे Java कोड में दिखाया गया है। हम स्नैपशॉट पर दो अद्यतन लागू करते हैं; यदि इनमें से कोई भी विफल हो जाए, तो स्नैपशॉट को पुनर्स्थापित कर देते हैं।
public class Main {
public static void main(String[] args) {
int[] balances = {500, 300};
int[] backup = balances.clone();
try {
balances[0] -= 200;
if (balances[0] < 0) throw new IllegalStateException("insufficient funds");
balances[1] += 200;
System.out.println("Commit: " + balances[0] + ", " + balances[1]);
} catch (RuntimeException e) {
balances = backup;
System.out.println("Rollback: " + balances[0] + ", " + balances[1]);
}
}
}सहेज-बिंदु
सहेज-बिंदु लेन-देन के भीतर बना एक चिह्न होता है। पूरे लेन-देन को निरस्त किए बिना आप इसमें वापस जा सकते हैं।
Savepoint sp = conn.setSavepoint()conn.rollback(sp)उस बिंदु के बाद किए गए कार्य को ही निरस्त करता है।
लंबे लेन-देन में आंशिक पुनर्प्राप्ति के लिए यह उपयोगी है।
पृथक्करण स्तर
पृथक्करण यह नियंत्रित करता है कि एक लेन-देन दूसरे के अपुष्ट कार्य में से क्या देख सकता है। जेडीबीसी स्तरों को conn.setTransactionIsolation(...) के माध्यम से परिभाषित करता है:
TRANSACTION_READ_COMMITTED— सामान्य पूर्वनिर्धारित स्तर।TRANSACTION_REPEATABLE_READTRANSACTION_SERIALIZABLE— सबसे मजबूत, सबसे धीमा।
उच्चतर पृथक्करण विसंगतियों को रोकता है, लेकिन समवर्तीता कम करता है।
पठन विसंगतियाँ
निचले पृथक्करण स्तर इनकी अनुमति दे सकते हैं:
- अपुष्ट पठन — दूसरे लेन-देन का अपुष्ट परिवर्तन दिखाई देना।
- गैर-पुनरावर्तनीय पठन — दो पठन के बीच कोई पंक्ति बदल जाना।
- प्रेत पठन — पिछली क्वेरी से मेल खाने वाली नई पंक्तियाँ दिखाई देना।
सबसे निचला ऐसा स्तर चुनें जो उन विसंगतियों को रोक सके जिन्हें आपका तर्क सहन नहीं कर सकता।
स्वचालित-पुष्टि पुनर्स्थापित करें
यदि आपने पूल से कनेक्शन लिया है, तो उसे वापस करने से पहले उसकी मूल स्थिति पुनर्स्थापित करें।
मैन्युअल लेन-देन के बाद फिर से conn.setAutoCommit(true) सेट करें (या कनेक्शन लेते समय दिखाई देने वाले मान पर रीसेट करें), ताकि अगला उपयोगकर्ता आपकी सेटिंग से अनपेक्षित व्यवहार न देखे।
लेन-देन छोटे रखें
लेन-देन की पुष्टि या पलटाव होने तक वह लॉक बनाए रखता है। लंबे लेन-देन दूसरे कार्यों को रोकते हैं और डेडलॉक का जोखिम बढ़ाते हैं।
- खुले लेन-देन के भीतर धीमी नेटवर्क कॉल या उपयोगकर्ता से पूछे जाने वाले संकेत न चलाएँ।
- पहले अपना डेटा एकत्र करें, फिर कनेक्शन खोलकर जल्दी से लिखें और पुष्टि करें।
छोटे और केंद्रित लेन-देन बहुत बेहतर ढंग से विस्तार कर सकते हैं।
त्वरित जाँच
connection.rollback() कॉल करने पर क्या प्रभाव पड़ता है?
पुनरावलोकन
लेन-देन आपको सब-कुछ-या-कुछ-भी-नहीं वाली सुरक्षा देते हैं:
setAutoCommit(false)से स्वचालित-पुष्टि बंद करें।- सफलता पर
commit()और विफलता परrollback()कॉल करें। - आंशिक पलटाव के लिए सहेज-बिंदु का उपयोग करें।
- शुद्धता और समवर्तीता के बीच संतुलन बनाने के लिए पृथक्करण स्तर समायोजित करें।
- पूल किया हुआ कनेक्शन वापस करने से पहले स्वचालित-पुष्टि पुनर्स्थापित करें।
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Transactions” पाठ निःशुल्क है?
हाँ—“Transactions” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Transactions” में मैं क्या सीखूँगा?
Commit और rollback आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“Transactions” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।