5.1 समकालिकता का मुद्दा

आइए थोड़ा दूर के सिद्धांत से शुरू करते हैं।

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

और लगभग हर एप्लिकेशन में, डेटाबेस (डीबी) एक या दूसरे तरीके से शामिल होते हैं, जो आम तौर पर दो कार्य करते हैं: आपसे प्राप्त होने पर डेटा स्टोर करें और बाद में अनुरोध पर उन्हें आपको प्रदान करें। शायद ही कोई अपना डेटाबेस बनाने के बारे में सोचता है, क्योंकि पहले से ही कई तैयार समाधान हैं। लेकिन आप अपने आवेदन के लिए सही कैसे चुनते हैं?

तो, आइए कल्पना करें कि आपने एक मोबाइल इंटरफ़ेस के साथ एक एप्लिकेशन लिखा है जो आपको घर के आसपास के कार्यों की पहले से सहेजी गई सूची को लोड करने की अनुमति देता है - अर्थात, डेटाबेस से पढ़ें, और इसे नए कार्यों के साथ पूरक करें, साथ ही प्रत्येक विशिष्ट को प्राथमिकता दें कार्य - 1 (उच्चतम) से 3 (निम्नतम) तक। मान लें कि आपका मोबाइल एप्लिकेशन एक समय में केवल एक व्यक्ति द्वारा उपयोग किया जाता है। लेकिन अब आपने अपनी माँ को अपनी रचना के बारे में बताने का साहस किया और अब वह दूसरी नियमित उपयोगकर्ता बन गई हैं। क्या होता है यदि आप एक ही समय में, ठीक उसी मिलीसेकंड में, किसी कार्य को सेट करने का निर्णय लेते हैं - "खिड़कियां धोएं" - प्राथमिकता के एक अलग स्तर पर?

पेशेवर शब्दों में, आपकी और माँ के डेटाबेस प्रश्नों को 2 प्रक्रियाओं के रूप में माना जा सकता है, जिन्होंने डेटाबेस के लिए एक क्वेरी बनाई। एक प्रक्रिया एक कंप्यूटर प्रोग्राम में एक इकाई है जो एक या अधिक थ्रेड्स पर चल सकती है। आमतौर पर, एक प्रक्रिया में मशीन कोड छवि, मेमोरी, संदर्भ और अन्य संसाधन होते हैं। दूसरे शब्दों में, प्रक्रिया को प्रोसेसर पर प्रोग्राम निर्देशों के निष्पादन के रूप में चित्रित किया जा सकता है। जब आपका एप्लिकेशन डेटाबेस के लिए अनुरोध करता है, तो हम इस तथ्य के बारे में बात कर रहे हैं कि आपका डेटाबेस एक प्रक्रिया से नेटवर्क पर प्राप्त अनुरोध को संसाधित करता है। यदि एक ही समय में एप्लिकेशन में दो उपयोगकर्ता बैठे हैं, तो समय में किसी विशेष क्षण में दो प्रक्रियाएँ हो सकती हैं।

जब कोई प्रक्रिया डेटाबेस के लिए अनुरोध करती है, तो वह इसे एक निश्चित अवस्था में पाती है। एक स्टेटफुल सिस्टम एक ऐसा सिस्टम है जो पिछली घटनाओं को याद रखता है और कुछ सूचनाओं को संग्रहीत करता है, जिसे "स्टेट" कहा जाता है। घोषित एक चर के रूप में integer0, 1, 2, या 42 की स्थिति हो सकती है। म्यूटेक्स (पारस्परिक बहिष्करण) में दो राज्य हैं: लॉक या अनलॉक , बाइनरी सेमाफोर ("आवश्यक" बनाम "रिलीज़") और आम तौर पर बाइनरी की तरह (बाइनरी) डेटा प्रकार और चर जिसमें केवल दो अवस्थाएँ हो सकती हैं - 1 या 0।

राज्य की अवधारणा के आधार पर, कई गणितीय और इंजीनियरिंग संरचनाएं आधारित हैं, जैसे कि एक परिमित ऑटोमेटन - एक मॉडल जिसमें एक इनपुट और एक आउटपुट होता है और समय के प्रत्येक क्षण में राज्यों के एक सीमित सेट में होता है - और "राज्य" "डिज़ाइन पैटर्न, जिसमें एक वस्तु आंतरिक स्थिति के आधार पर व्यवहार बदलती है (उदाहरण के लिए, एक या दूसरे चर को किस मान को सौंपा गया है) के आधार पर।

इसलिए, मशीन की दुनिया में अधिकांश वस्तुओं में कुछ स्थिति होती है जो समय के साथ बदल सकती है: हमारी पाइपलाइन, जो एक बड़े डेटा पैकेट को संसाधित करती है, एक त्रुटि फेंकती है और विफल हो जाती है, या वॉलेट ऑब्जेक्ट संपत्ति , जो उपयोगकर्ता के खाते में शेष राशि को संग्रहीत करती है। खाता, पेरोल प्राप्तियों के बाद परिवर्तन।

एक राज्य से दूसरे राज्य में संक्रमण ("संक्रमण") - कहते हैं, प्रगति से विफल - एक ऑपरेशन कहा जाता है। शायद, हर कोई CRUD संचालन जानता है - create, read, update, deleteया इसी तरह के HTTP तरीके - POST, GET, PUT, DELETE। लेकिन प्रोग्रामर अक्सर अपने कोड में संचालन के लिए अन्य नाम देते हैं, क्योंकि डेटाबेस से केवल एक निश्चित मान को पढ़ने की तुलना में ऑपरेशन अधिक जटिल हो सकता है - यह डेटा की जांच भी कर सकता है, और फिर हमारे ऑपरेशन, जिसने एक फ़ंक्शन का रूप ले लिया है, कहा जाएगा, उदाहरण के लिए, और validate()इन कार्यों-कार्यों को कौन करता है? प्रक्रियाओं का पहले ही वर्णन किया जा चुका है।

थोड़ा और, और आप समझ जाएंगे कि मैं शर्तों का इतने विस्तार से वर्णन क्यों करता हूं!

कोई भी ऑपरेशन - चाहे वह एक फंक्शन हो, या, वितरित सिस्टम में, किसी अन्य सर्वर को अनुरोध भेजना - में 2 गुण होते हैं: इनवोकेशन टाइम और पूरा होने का समय (पूर्ण होने का समय) , जो इनवोकेशन समय (जेपसेन के शोधकर्ताओं) से सख्ती से अधिक होगा सैद्धांतिक धारणाओं से आगे बढ़ें कि इन दोनों टाइमस्टैम्प को काल्पनिक, पूरी तरह से सिंक्रनाइज़, विश्व स्तर पर उपलब्ध घड़ियां दी जाएंगी)।

आइए हमारे टू-डू लिस्ट एप्लिकेशन की कल्पना करें। आप में मोबाइल इंटरफ़ेस के माध्यम से डेटाबेस के लिए अनुरोध करते हैं 14:00:00.014, और आपकी मां ने 13:59:59.678(यानी, 336 मिलीसेकंड पहले) उसी इंटरफ़ेस के माध्यम से टू-डू सूची को अपडेट किया, इसमें बर्तन धोना शामिल किया। आपके डेटाबेस के लिए नेटवर्क विलंब और कार्यों की संभावित कतार को ध्यान में रखते हुए, यदि आपके और आपकी माँ के अलावा, आपकी माँ के सभी मित्र भी आपके आवेदन का उपयोग करते हैं, तो डेटाबेस आपकी प्रक्रिया के बाद माँ के अनुरोध को निष्पादित कर सकता है। दूसरे शब्दों में, इस बात की संभावना है कि आपके दो अनुरोधों के साथ-साथ आपकी मां की गर्लफ्रेंड के अनुरोधों को एक ही समय (समवर्ती) एक ही डेटा पर भेजा जाएगा।

इसलिए हम डेटाबेस और वितरित अनुप्रयोगों के क्षेत्र में सबसे महत्वपूर्ण शब्द - संगामिति पर आ गए हैं। दो परिचालनों की एक साथ होने का वास्तव में क्या अर्थ हो सकता है? यदि कुछ संक्रिया T1 और कुछ संक्रिया T2 दी गई हो, तो:

  • T1 को निष्पादन T2 के प्रारंभ समय से पहले शुरू किया जा सकता है, और T2 के प्रारंभ और समाप्ति समय के बीच समाप्त किया जा सकता है
  • T2 को T1 के प्रारंभ समय से पहले शुरू किया जा सकता है, और T1 के प्रारंभ और अंत के बीच समाप्त किया जा सकता है
  • T1 निष्पादन के प्रारंभ और समाप्ति समय के बीच T1 को प्रारंभ और समाप्त किया जा सकता है
  • और कोई अन्य परिदृश्य जहां T1 और T2 का कुछ सामान्य निष्पादन समय है

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

और क्या, वास्तव में, विशुद्ध रूप से सैद्धांतिक रूप से गलत हो सकता है?

साझा किए गए डेटा पर काम करते समय, समवर्ती से संबंधित कई समस्याएं हो सकती हैं, जिन्हें "दौड़ की स्थिति" भी कहा जाता है। पहली समस्या तब होती है जब किसी प्रक्रिया को वह डेटा प्राप्त होता है जो उसे प्राप्त नहीं होना चाहिए था: अधूरा, अस्थायी, रद्द, या अन्यथा "गलत" डेटा। दूसरी समस्या तब होती है जब प्रक्रिया को पुराना डेटा प्राप्त होता है, यानी वह डेटा जो डेटाबेस की अंतिम सहेजी गई स्थिति के अनुरूप नहीं होता है। मान लीजिए कि कुछ एप्लिकेशन ने उपयोगकर्ता के खाते से शून्य शेष राशि के साथ पैसे निकाले हैं, क्योंकि डेटाबेस ने खाते की स्थिति को वापस कर दिया है, इससे पैसे की अंतिम निकासी को ध्यान में नहीं रखा गया है, जो कि कुछ मिलीसेकंड पहले हुआ था। स्थिति इतनी-इतनी है, है ना?

5.2 लेन-देन हमें बचाने आए

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

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

इस समस्या को हल करने के लिए, लेन-देन की ऐसी संपत्ति को "अलगाव" कहा जाता था: हमारे लेन-देन को निष्पादित किया जाता है जैसे कि उसी क्षण कोई अन्य लेनदेन नहीं किया जा रहा हो। हमारा डेटाबेस समवर्ती संचालन करता है जैसे कि यह क्रमिक रूप से उन्हें एक के बाद एक निष्पादित कर रहा था - वास्तव में, उच्चतम अलगाव स्तर को सख्त सीरियल करने योग्य कहा जाता है । हां, उच्चतम, जिसका अर्थ है कि कई स्तर हैं।

"रुको," तुम कहते हो। अपने घोड़ों को पकड़ो, श्रीमान।

आइए याद करें कि मैंने कैसे वर्णन किया कि प्रत्येक ऑपरेशन का कॉल समय और निष्पादन समय होता है। सुविधा के लिए, आप 2 क्रियाओं के रूप में कॉल करने और निष्पादित करने पर विचार कर सकते हैं। तब सभी कॉल और निष्पादन क्रियाओं की क्रमबद्ध सूची को डेटाबेस का इतिहास कहा जा सकता है। फिर लेन-देन अलगाव स्तर इतिहास का एक समूह है। हम यह निर्धारित करने के लिए अलगाव स्तरों का उपयोग करते हैं कि कौन सी कहानियाँ "अच्छी" हैं। जब हम कहते हैं कि एक कहानी "धारावाहिकता को तोड़ती है" या "धारावाहिक नहीं है", तो हमारा मतलब है कि कहानी धारावाहिक कहानियों के सेट में नहीं है।

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

कई संभावित विसंगतियाँ हैं। अर्थात्, विसंगतियाँ कुछ प्रकार की अवांछनीय डेटा स्थिति हैं जो डेटाबेस तक प्रतिस्पर्धी पहुँच के दौरान हो सकती हैं। और कुछ अवांछित स्थितियों से बचने के लिए, डेटाबेस अलगाव के विभिन्न स्तरों का उपयोग करते हैं - अर्थात, अवांछित राज्यों से डेटा सुरक्षा के विभिन्न स्तर। ये स्तर (4 टुकड़े) ANSI SQL-92 मानक में सूचीबद्ध थे।

इन स्तरों का वर्णन कुछ शोधकर्ताओं को अस्पष्ट लगता है, और वे अपने स्वयं के, अधिक विस्तृत, वर्गीकरण प्रदान करते हैं। मैं आपको सलाह देता हूं कि आप पहले से उल्लेखित जेपसेन, साथ ही हर्मिटेज प्रोजेक्ट पर ध्यान दें, जिसका उद्देश्य यह स्पष्ट करना है कि विशिष्ट DBMS, जैसे कि MySQL या PostgreSQL द्वारा किस अलगाव स्तर की पेशकश की जाती है। यदि आप इस रिपॉजिटरी से फाइलें खोलते हैं, तो आप देख सकते हैं कि कुछ विसंगतियों के लिए डेटाबेस का परीक्षण करने के लिए वे SQL कमांड के किस क्रम का उपयोग करते हैं, और आप अपनी रुचि के डेटाबेस के लिए कुछ ऐसा ही कर सकते हैं)। आपकी रुचि बनाए रखने के लिए यहां रिपॉजिटरी से एक उदाहरण दिया गया है:

-- Database: MySQL

-- Setup before test
create table test (id int primary key, value int) engine=innodb;
insert into test (id, value) values (1, 10), (2, 20);

-- Test the "read uncommited" isolation level on the "Intermediate Reads" (G1b) anomaly
set session transaction isolation level read uncommitted; begin; -- T1
set session transaction isolation level read uncommitted; begin; -- T2
update test set value = 101 where id = 1; -- T1
select * from test; -- T2. Shows 1 => 101
update test set value = 11 where id = 1; -- T1
commit; -- T1
select * from test; -- T2. Now shows 1 => 11
commit; -- T2

-- Result: doesn't prevent G1b

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

5.3 "I" और ACID में अन्य अक्षर

अलगाव मूल रूप से लोगों का मतलब है जब वे सामान्य रूप से एसीआईडी ​​​​के बारे में बात करते हैं। और यह इस कारण से है कि मैंने इस संक्षिप्त नाम का विश्लेषण अलगाव के साथ शुरू किया, और क्रम में नहीं चला, जैसा कि इस अवधारणा को समझाने की कोशिश करने वाले आमतौर पर करते हैं। अब आइए शेष तीन अक्षरों को देखें।

बैंक हस्तांतरण के साथ हमारे उदाहरण को फिर से याद करें। एक खाते से दूसरे खाते में धनराशि स्थानांतरित करने के लेन-देन में पहले खाते से निकासी की प्रक्रिया और दूसरे पर पुनःपूर्ति की कार्रवाई शामिल है। यदि दूसरे खाते की पुनःपूर्ति कार्रवाई विफल हो जाती है, तो आप शायद नहीं चाहते कि पहले खाते से निकासी की कार्रवाई हो। दूसरे शब्दों में, या तो लेन-देन पूरी तरह से सफल होता है, या यह बिल्कुल नहीं होता है, लेकिन इसे केवल कुछ हिस्से के लिए नहीं बनाया जा सकता है। इस संपत्ति को "परमाणुता" कहा जाता है, और यह एसीआईडी ​​​​में "ए" है।

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

Cइस गारंटी को "स्थिरता" और एसीआईडी ​​​​में एक पत्र कहा जाता है (वितरित अनुप्रयोगों की दुनिया से स्थिरता के साथ भ्रमित नहीं होना, जिसके बारे में हम बाद में बात करेंगे)। ordersमैं एसीआईडी ​​​​के अर्थ में स्थिरता के लिए एक स्पष्ट उदाहरण दूंगा: एक ऑनलाइन स्टोर के लिए एक आवेदन तालिका में एक पंक्ति जोड़ना चाहता है , और तालिका से आईडी कोproduct_id कॉलम में इंगित किया जाएगा - ठेठ ।productsforeign key

यदि उत्पाद, कहते हैं, वर्गीकरण से हटा दिया गया था, और तदनुसार, डेटाबेस से, तो पंक्ति सम्मिलित करने का ऑपरेशन नहीं होना चाहिए, और हमें एक त्रुटि मिलेगी। यह गारंटी, दूसरों की तुलना में, मेरी राय में थोड़ी दूर की कौड़ी है - यदि केवल इसलिए कि डेटाबेस से बाधाओं के सक्रिय उपयोग का अर्थ है डेटा के लिए जिम्मेदारी स्थानांतरित करना (साथ ही व्यावसायिक तर्क का आंशिक स्थानांतरण, अगर हम बात कर रहे हैं चेक के रूप में ऐसी बाधा) आवेदन से डेटाबेस तक, जैसा कि वे अब कहते हैं, बस इतना ही है।

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

बस दूसरे दिन, मैं AWS (Amazon Web Services) से DynamoDB के साथ काम कर रहा था, और सहेजने के लिए कुछ डेटा भेजा, और एक उत्तर HTTP 200(ठीक), या ऐसा कुछ प्राप्त करने के बाद, मैंने इसे जाँचने का निर्णय लिया - और यह नहीं देखा डेटाबेस में अगले 10 सेकंड के लिए डेटा। यही है, डायनेमोडीबी ने मेरा डेटा प्रतिबद्ध किया, लेकिन डेटा की नवीनतम प्रति प्राप्त करने के लिए सभी नोड्स तुरंत सिंक्रनाइज़ नहीं हुए (हालांकि यह कैश में हो सकता है)। यहां हम फिर से वितरित प्रणालियों के संदर्भ में निरंतरता के क्षेत्र में चढ़ गए, लेकिन इसके बारे में बात करने का समय अभी तक नहीं आया है।

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