ठीक है, मुझे प्रतिबद्धता और रोलबैक के बीच का अंतर पता है और इन परिचालनों को क्या करना है। हालांकि, मुझे यकीन नहीं है कि मामलों में क्या करना है जहां मैं प्रतिबद्ध(), रोलबैक() और/या कुछ भी नहीं करते समय एक ही व्यवहार प्राप्त कर सकता हूं।जावा: प्रतिबद्ध बनाम रोलबैक बनाम कुछ भी नहीं जब semantics अपरिवर्तित है?
उदाहरण के लिए, मान लीजिए कि मेरे पास निम्न कोड है जो डीबी: पर लिखने के बिना एक क्वेरी निष्पादित करता है, मैं एक ऐसे अनुप्रयोग पर काम कर रहा हूं जो SQLite डेटाबेस के साथ संचार करता है।
try {
if (deleteById(2))
// a) delete successful (1 row deleted)
else
// b) delete unsuccessful (0 row deleted, no errors)
} catch (SQLException e) {
// c) delete failed (because of an error (possibly due to constraint violation in DB))
}
गौर करें कि एक अर्थ के दृष्टिकोण से, प्रतिबद्ध या मामलों में रोलबैक कर ख) और ग) में परिणाम:
try {
doSomeQuery()
// b) success
} catch (SQLException e) {
// a) failed (because of exception)
}
या और भी दिलचस्प है, तो निम्न कोड है, जो एक ही पंक्ति को हटा देता है पर विचार वही व्यवहार
आम तौर पर, प्रत्येक मामले के अंदर करने के लिए कई विकल्प हैं (क, ख, ग):
- प्रतिबद्ध
- रोलबैक
कुछ नहीं कर क्या कोई मार्गनिर्देश हैं या एक विशेष ऑपरेशन चुनने के प्रदर्शन लाभ? सही तरीका क्या है?
नोट: मान लें कि ऑटो-प्रतिबद्ध अक्षम है।
तो यह संभव है प्रतिबद्ध करने के लिए तेजी से हो जाएगा। रोलबैक के लिए डीबी को लेनदेन लॉग की जांच करने और किए गए किसी भी बदलाव को वापस करने की आवश्यकता है। भले ही यह "कोई परिवर्तन नहीं" हो, फिर भी चेक दिखाई देगा। – JNK
रोलबैक एक ही लेनदेन में किए गए अन्य अपडेटों को पूर्ववत कर देगा। जहां आपके पास केवल एक है, इससे कोई फर्क नहीं पड़ता है (जेएनके के वर्णन के अलावा) लेकिन यदि आप बाद में एक और जोड़ते हैं और इसे संभालना भूल जाते हैं तो आप काट सकते हैं। अंदर आने के लिए एक अच्छी आदत। –
@ जेएनके जो आरडीबीएम पर थोड़ा निर्भर है - ट्रिगर्स के इंस्टीटैड के साथ भी संभावित संघर्ष है - लेकिन यह कुछ हद तक शांत हो जाएगा। – Andrew