5.1 ஒரே நேரத்தில் பிரச்சினை

கொஞ்சம் தொலைதூரக் கோட்பாட்டுடன் ஆரம்பிக்கலாம்.

புரோகிராமர்கள் உருவாக்கும் எந்தவொரு தகவல் அமைப்பும் (அல்லது வெறுமனே, ஒரு பயன்பாடு) பல பொதுவான தொகுதிகளைக் கொண்டுள்ளது, அவை ஒவ்வொன்றும் தேவையான செயல்பாட்டின் ஒரு பகுதியை வழங்குகிறது. எடுத்துக்காட்டாக, கிளையன்ட் தரவை விரைவாகப் படிப்பதை உறுதிசெய்ய, ஆதார-தீவிர செயல்பாட்டின் முடிவை நினைவில் வைக்க கேச் பயன்படுத்தப்படுகிறது, ஸ்ட்ரீம் செயலாக்க கருவிகள் ஒத்திசைவற்ற செயலாக்கத்திற்காக மற்ற கூறுகளுக்கு செய்திகளை அனுப்ப உங்களை அனுமதிக்கின்றன, மேலும் தொகுதி செயலாக்க கருவிகள் " ரேக்" சில கால இடைவெளியில் தரவுகளின் திரட்டப்பட்ட தொகுதிகள். .

மேலும் கிட்டத்தட்ட ஒவ்வொரு பயன்பாட்டிலும், தரவுத்தளங்கள் (DB கள்) ஒரு வழியில் அல்லது வேறு வழியில் ஈடுபட்டுள்ளன, அவை வழக்கமாக இரண்டு செயல்பாடுகளைச் செய்கின்றன: உங்களிடமிருந்து தரவைப் பெறும்போது அவற்றைச் சேமித்து பின்னர் கோரிக்கையின் பேரில் அவற்றை உங்களுக்கு வழங்கவும். அரிதாகவே எவரும் தங்கள் சொந்த தரவுத்தளத்தை உருவாக்க நினைக்கிறார்கள், ஏனெனில் ஏற்கனவே பல ஆயத்த தீர்வுகள் உள்ளன. ஆனால் உங்கள் விண்ணப்பத்திற்கு சரியானதை எவ்வாறு தேர்வு செய்வது?

எனவே, நீங்கள் ஒரு மொபைல் இடைமுகத்துடன் ஒரு பயன்பாட்டை எழுதியுள்ளீர்கள் என்று கற்பனை செய்துகொள்வோம், இது வீட்டைச் சுற்றி முன்பு சேமித்த பணிகளின் பட்டியலை ஏற்ற அனுமதிக்கிறது - அதாவது, தரவுத்தளத்திலிருந்து படித்து, புதிய பணிகளுடன் அதை நிரப்பவும், அத்துடன் ஒவ்வொரு குறிப்பிட்ட பணிகளுக்கும் முன்னுரிமை கொடுங்கள். பணி - 1 (அதிகபட்சம்) முதல் 3 (குறைந்தது). உங்கள் மொபைல் செயலியை ஒரே நேரத்தில் ஒருவர் மட்டுமே பயன்படுத்துகிறார் என்று வைத்துக்கொள்வோம். ஆனால் இப்போது நீங்கள் உங்கள் படைப்பைப் பற்றி உங்கள் தாயிடம் சொல்லத் துணிந்தீர்கள், இப்போது அவர் இரண்டாவது வழக்கமான பயனராக மாறிவிட்டார். ஒரே நேரத்தில், அதே மில்லி வினாடியில், சில பணியை - "ஜன்னல்களைக் கழுவவும்" - வேறு அளவு முன்னுரிமைக்கு அமைக்க முடிவு செய்தால் என்ன நடக்கும்?

தொழில்முறை அடிப்படையில், உங்கள் மற்றும் தாயின் தரவுத்தள வினவல்கள் தரவுத்தளத்தில் ஒரு வினவல் செய்யப்பட்ட 2 செயல்முறைகளாக கருதப்படலாம். ஒரு செயல்முறை என்பது கணினி நிரலில் ஒன்று அல்லது அதற்கு மேற்பட்ட நூல்களில் இயங்கக்கூடிய ஒரு நிறுவனம் ஆகும். பொதுவாக, ஒரு செயல்முறையானது இயந்திர குறியீடு படம், நினைவகம், சூழல் மற்றும் பிற ஆதாரங்களைக் கொண்டுள்ளது. வேறு வார்த்தைகளில் கூறுவதானால், செயலியில் நிரல் வழிமுறைகளை செயல்படுத்துவது என செயல்முறை வகைப்படுத்தப்படும். உங்கள் விண்ணப்பம் தரவுத்தளத்திற்கு ஒரு கோரிக்கையை வைக்கும் போது, ​​உங்கள் தரவுத்தளம் ஒரு செயல்முறையிலிருந்து பிணையத்தில் பெறப்பட்ட கோரிக்கையை செயலாக்குகிறது என்பதைப் பற்றி நாங்கள் பேசுகிறோம். ஒரே நேரத்தில் இரண்டு பயனர்கள் பயன்பாட்டில் அமர்ந்திருந்தால், எந்த நேரத்திலும் இரண்டு செயல்முறைகள் இருக்கலாம்.

சில செயல்முறைகள் தரவுத்தளத்திற்கு ஒரு கோரிக்கையை வைக்கும் போது, ​​அது ஒரு குறிப்பிட்ட நிலையில் அதைக் கண்டறியும். ஒரு மாநில அமைப்பு என்பது முந்தைய நிகழ்வுகளை நினைவில் வைத்து சில தகவல்களைச் சேமிக்கும் ஒரு அமைப்பு, இது "நிலை" என்று அழைக்கப்படுகிறது. integer0, 1, 2, அல்லது 42 என்று ஒரு மாறி அறிவிக்கப்பட்டது. மியூடெக்ஸ் (பரஸ்பர விலக்கு) இரண்டு நிலைகளைக் கொண்டுள்ளது: பூட்டப்பட்டது அல்லது திறக்கப்பட்டது , பைனரி செமாஃபோர் ("தேவையானது" எதிராக "வெளியிடப்பட்டது") மற்றும் பொதுவாக பைனரி (பைனரி) தரவு வகைகள் மற்றும் மாறிகள் இரண்டு நிலைகளை மட்டுமே கொண்டிருக்கும் - 1 அல்லது 0.

மாநிலத்தின் கருத்தின் அடிப்படையில், பல கணித மற்றும் பொறியியல் கட்டமைப்புகள் அடிப்படையாக உள்ளன, அதாவது வரையறுக்கப்பட்ட ஆட்டோமேட்டன் - ஒரு உள்ளீடு மற்றும் ஒரு வெளியீட்டைக் கொண்ட ஒரு மாதிரி மற்றும் ஒவ்வொரு தருணத்திலும் வரையறுக்கப்பட்ட நிலைகளில் ஒன்றில் உள்ளது - மற்றும் “நிலை "வடிவமைப்பு முறை, இதில் ஒரு பொருள் உள் நிலையைப் பொறுத்து நடத்தையை மாற்றுகிறது (எடுத்துக்காட்டாக, ஒன்று அல்லது மற்றொரு மாறிக்கு என்ன மதிப்பு ஒதுக்கப்படுகிறது என்பதைப் பொறுத்து).

எனவே, இயந்திர உலகில் உள்ள பெரும்பாலான பொருள்கள் காலப்போக்கில் மாறக்கூடிய சில நிலைகளைக் கொண்டுள்ளன: ஒரு பெரிய தரவுப் பொதியைச் செயலாக்கும் எங்கள் பைப்லைன், பிழையை எறிந்து தோல்வியடைகிறது அல்லது பயனரின் பணத்தைச் சேமிக்கும் வாலட் பொருள் சொத்து. கணக்கு, ஊதிய ரசீதுக்குப் பிறகு மாற்றங்கள்.

ஒரு நிலையிலிருந்து மற்றொரு நிலைக்கு மாறுதல் ("மாற்றம்") - செயல்பாட்டில் இருந்து தோல்விக்கு - ஒரு செயல்பாடு என்று அழைக்கப்படுகிறது. அநேகமாக, அனைவருக்கும் CRUD செயல்பாடுகள் தெரியும் - , , , அல்லது இதே போன்ற HTTP முறைகள் - , , , . ஆனால் புரோகிராமர்கள் பெரும்பாலும் தங்கள் குறியீட்டில் உள்ள செயல்பாடுகளுக்கு பிற பெயர்களைக் கொடுக்கிறார்கள், ஏனெனில் செயல்பாடு தரவுத்தளத்திலிருந்து ஒரு குறிப்பிட்ட மதிப்பைப் படிப்பதை விட மிகவும் சிக்கலானதாக இருக்கும் - இது தரவையும் சரிபார்க்கலாம், பின்னர் ஒரு செயல்பாட்டின் வடிவத்தை எடுத்த எங்கள் செயல்பாடு, அழைக்கப்படும், எடுத்துக்காட்டாக, இந்த செயல்பாடுகள்-செயல்பாடுகளை யார் செய்கிறார்கள்? செயல்முறைகள் ஏற்கனவே விவரிக்கப்பட்டுள்ளன.createreadupdatedeletePOSTGETPUTDELETEvalidate()

இன்னும் கொஞ்சம், நான் ஏன் விதிமுறைகளை இவ்வளவு விரிவாக விவரிக்கிறேன் என்பதை நீங்கள் புரிந்துகொள்வீர்கள்!

எந்தவொரு செயல்பாடும் - அது ஒரு செயல்பாடாக இருக்கலாம் அல்லது விநியோகிக்கப்பட்ட அமைப்புகளில், மற்றொரு சேவையகத்திற்கு கோரிக்கையை அனுப்புதல் - 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 செயல்களாகக் கருதலாம். அனைத்து அழைப்பு மற்றும் செயல்படுத்தல் செயல்களின் வரிசைப்படுத்தப்பட்ட பட்டியலை தரவுத்தளத்தின் வரலாறு என்று அழைக்கலாம். பின்னர் பரிவர்த்தனை தனிமை நிலை என்பது வரலாறுகளின் தொகுப்பாகும். எந்தக் கதைகள் "நல்லது" என்பதைத் தீர்மானிக்க தனிமைப்படுத்தப்பட்ட நிலைகளைப் பயன்படுத்துகிறோம். ஒரு கதை "சீரியலிசத்தை உடைக்கிறது" அல்லது "சீரியலாக இல்லை" என்று சொல்லும்போது, ​​அந்தக் கதை தொடர் கதைகளின் தொகுப்பில் இல்லை என்று அர்த்தம்.

நாம் எந்த வகையான கதைகளைப் பற்றி பேசுகிறோம் என்பதை தெளிவுபடுத்த, நான் எடுத்துக்காட்டுகளைத் தருகிறேன். உதாரணமாக, அத்தகைய ஒரு வகையான வரலாறு உள்ளது - இடைநிலை வாசிப்பு . மற்றொரு இயங்கும் பரிவர்த்தனை B ஆல் மாற்றியமைக்கப்பட்ட ஒரு வரிசையில் இருந்து தரவைப் படிக்க பரிவர்த்தனை A அனுமதிக்கப்படும்போது இது நிகழ்கிறது மற்றும் இன்னும் உறுதி செய்யப்படவில்லை ("உறுதியளிக்கப்படவில்லை") - அதாவது, உண்மையில், மாற்றங்கள் இன்னும் இறுதியாக செய்யப்படவில்லை பரிவர்த்தனை B, மற்றும் அது எந்த நேரத்திலும் அவற்றை ரத்து செய்யலாம். மேலும், எடுத்துக்காட்டாக, ரத்துசெய்யப்பட்ட திரும்பப் பெறுதல் பரிவர்த்தனைக்கான எங்களின் உதாரணம் தான் கைவிடப்பட்ட வாசிப்பு

பல சாத்தியமான முரண்பாடுகள் உள்ளன. அதாவது, முரண்பாடுகள் என்பது ஒருவித விரும்பத்தகாத தரவு நிலையாகும், அவை தரவுத்தளத்திற்கான போட்டி அணுகலின் போது ஏற்படலாம். சில தேவையற்ற நிலைகளைத் தவிர்ப்பதற்காக, தரவுத்தளங்கள் வெவ்வேறு நிலைகளில் தனிமைப்படுத்தலைப் பயன்படுத்துகின்றன - அதாவது, தேவையற்ற நிலைகளிலிருந்து தரவுப் பாதுகாப்பின் வெவ்வேறு நிலைகள். இந்த நிலைகள் (4 துண்டுகள்) ANSI SQL-92 தரநிலையில் பட்டியலிடப்பட்டுள்ளன.

இந்த நிலைகளின் விளக்கம் சில ஆராய்ச்சியாளர்களுக்கு தெளிவற்றதாகத் தெரிகிறது, மேலும் அவர்கள் தங்கள் சொந்த, விரிவான, வகைப்பாடுகளை வழங்குகிறார்கள். MySQL அல்லது PostgreSQL போன்ற குறிப்பிட்ட DBMS மூலம் என்ன தனிமைப்படுத்தல் நிலைகள் வழங்கப்படுகின்றன என்பதைத் தெளிவுபடுத்தும் நோக்கத்துடன் ஏற்கனவே குறிப்பிட்டுள்ள ஜெப்சென் மற்றும் ஹெர்மிடேஜ் திட்டத்தில் கவனம் செலுத்துமாறு நான் உங்களுக்கு அறிவுறுத்துகிறேன். இந்த களஞ்சியத்திலிருந்து கோப்புகளைத் திறந்தால், சில முரண்பாடுகளுக்கு தரவுத்தளத்தை சோதிக்க அவர்கள் பயன்படுத்தும் 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 இல் உள்ள மற்ற எழுத்துக்கள்

மக்கள் பொதுவாக ACID பற்றி பேசும்போது தனிமைப்படுத்தல் என்பது அடிப்படையில். இந்த காரணத்திற்காகவே நான் இந்த சுருக்கத்தின் பகுப்பாய்வை தனிமைப்படுத்தத் தொடங்கினேன், மேலும் இந்த கருத்தை விளக்க முயற்சிப்பவர்கள் வழக்கமாகச் செய்வது போல ஒழுங்காக செல்லவில்லை. இப்போது மீதமுள்ள மூன்று எழுத்துக்களைப் பார்ப்போம்.

வங்கி பரிமாற்றத்துடன் எங்கள் உதாரணத்தை மீண்டும் நினைவுபடுத்துங்கள். ஒரு கணக்கிலிருந்து மற்றொரு கணக்கிற்கு நிதியை மாற்றுவதற்கான பரிவர்த்தனையானது முதல் கணக்கிலிருந்து திரும்பப் பெறும் நடவடிக்கை மற்றும் இரண்டாவது கணக்கை நிரப்புதல் ஆகியவற்றை உள்ளடக்கியது. இரண்டாவது கணக்கின் நிரப்புதல் செயல்பாடு தோல்வியுற்றால், முதல் கணக்கிலிருந்து திரும்பப் பெறும் செயல்பாடு ஏற்படுவதை நீங்கள் ஒருவேளை விரும்பவில்லை. வேறு வார்த்தைகளில் கூறுவதானால், பரிவர்த்தனை முழுமையாக வெற்றிபெறுகிறது, அல்லது அது நடக்காது, ஆனால் அது சில பகுதிகளுக்கு மட்டுமே செய்ய முடியாது. இந்த பண்பு "அணுசக்தி" என்று அழைக்கப்படுகிறது, மேலும் இது ACID இல் "A" ஆகும்.

எங்கள் பரிவர்த்தனை செயல்படுத்தப்படும் போது, ​​எந்த செயல்பாட்டைப் போலவே, இது தரவுத்தளத்தை ஒரு செல்லுபடியாகும் நிலையில் இருந்து மற்றொரு நிலைக்கு மாற்றும். சில தரவுத்தளங்கள் தடைகள் என அழைக்கப்படுபவை வழங்குகின்றன - அதாவது, முதன்மை அல்லது இரண்டாம் நிலை விசைகள், குறியீடுகள், இயல்புநிலை மதிப்புகள், நெடுவரிசை வகைகள் போன்றவற்றைப் பற்றிய, சேமிக்கப்பட்ட தரவுகளுக்குப் பொருந்தும் விதிகள். எனவே, பரிவர்த்தனை செய்யும் போது, ​​இந்தக் கட்டுப்பாடுகள் அனைத்தும் நிறைவேற்றப்படும் என்பதில் உறுதியாக இருக்க வேண்டும்.

இந்த உத்தரவாதம் "நிலைத்தன்மை" மற்றும் ACID இல் ஒரு கடிதம் என்று அழைக்கப்படுகிறது C(விநியோகிக்கப்பட்ட பயன்பாடுகளின் உலகில் இருந்து நிலைத்தன்மையுடன் குழப்பமடையக்கூடாது, அதைப் பற்றி நாங்கள் பின்னர் பேசுவோம்). ACID என்ற அர்த்தத்தில் நிலைத்தன்மைக்கு நான் ஒரு தெளிவான உதாரணம் தருகிறேன்: ஆன்லைன் ஸ்டோருக்கான பயன்பாடு ordersஅட்டவணையில் ஒரு வரிசையைச் சேர்க்க விரும்புகிறது, மேலும் அட்டவணையில் இருந்து ஐடிproduct_id நெடுவரிசையில் குறிக்கப்படும் - பொதுவானது .productsforeign key

தயாரிப்பு, வகைப்படுத்தலில் இருந்து அகற்றப்பட்டு, அதன்படி, தரவுத்தளத்திலிருந்து அகற்றப்பட்டால், வரிசை செருகும் செயல்பாடு நடக்கக்கூடாது, மேலும் பிழையைப் பெறுவோம். இந்த உத்தரவாதம், மற்றவர்களுடன் ஒப்பிடும்போது, ​​சற்று தொலைவில் உள்ளது, என் கருத்துப்படி - தரவுத்தளத்தில் இருந்து தடைகளை செயலில் பயன்படுத்துவது தரவுக்கான பொறுப்பை மாற்றுவதாகும் (அத்துடன் வணிக தர்க்கத்தை ஓரளவு மாற்றுவது, நாங்கள் பேசினால். CHECK போன்ற ஒரு தடை ) பயன்பாட்டிலிருந்து தரவுத்தளத்திற்கு, அவர்கள் இப்போது சொல்வது போல், அப்படியே உள்ளது.

இறுதியாக, அது உள்ளது D- "எதிர்ப்பு" (நீடிப்பு). கணினி தோல்வி அல்லது வேறு ஏதேனும் தோல்வி பரிவர்த்தனை முடிவுகள் அல்லது தரவுத்தள உள்ளடக்கத்தை இழக்க வழிவகுக்கக்கூடாது. அதாவது, பரிவர்த்தனை வெற்றிகரமாக இருந்தது என்று தரவுத்தளம் பதிலளித்தால், தரவு நிலையற்ற நினைவகத்தில் பதிவு செய்யப்பட்டது என்று அர்த்தம் - எடுத்துக்காட்டாக, ஒரு வன் வட்டில். இது, அடுத்த வாசிப்பு கோரிக்கையின் தரவை உடனடியாகப் பார்ப்பீர்கள் என்று அர்த்தமல்ல.

மறுநாள், நான் AWS (Amazon Web Services) இலிருந்து DynamoDB உடன் பணிபுரிந்து கொண்டிருந்தேன், மேலும் சில தரவைச் சேமிப்பதற்காக அனுப்பினேன், ஒரு பதிலைப் பெற்ற பிறகு ( HTTP 200சரி), அல்லது அது போன்ற ஏதாவது ஒன்றைச் சரிபார்க்க முடிவு செய்தேன் - இதைப் பார்க்கவில்லை. அடுத்த 10 வினாடிகளுக்கு தரவுத்தளத்தில் உள்ள தரவு. அதாவது, DynamoDB எனது தரவைச் செய்தது, ஆனால் தரவின் சமீபத்திய நகலைப் பெற அனைத்து முனைகளும் உடனடியாக ஒத்திசைக்கப்படவில்லை (அது தற்காலிக சேமிப்பில் இருந்தாலும்). விநியோகிக்கப்பட்ட அமைப்புகளின் சூழலில் நாங்கள் மீண்டும் நிலைத்தன்மையின் பிரதேசத்தில் ஏறினோம், ஆனால் அதைப் பற்றி பேசுவதற்கான நேரம் இன்னும் வரவில்லை.

எனவே ACID உத்தரவாதங்கள் என்ன என்பதை இப்போது நாம் அறிவோம். அவை ஏன் பயனுள்ளதாக இருக்கும் என்பதும் எங்களுக்குத் தெரியும். ஆனால் ஒவ்வொரு பயன்பாட்டிலும் அவை உண்மையில் தேவையா? மற்றும் இல்லை என்றால், சரியாக எப்போது? அனைத்து DBகளும் இந்த உத்தரவாதங்களை வழங்குகின்றனவா, இல்லையெனில், அதற்கு பதிலாக அவை என்ன வழங்குகின்றன?