முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 11 · பாடம் 3 இன் 4பாடத்திட்டத்தில் 43/57~15 min
தொகுதி பாடங்கள் (3/4)

புதுப்பிப்புக்கு பூட்டுதல் மற்றும் தேர்ந்தெடுக்கவும்

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

50€ மதிப்புள்ள பொருட்களை வாங்குவதற்கு பயனரிடம் போதுமான இருப்பு இருக்கிறதா என்பதை நீங்கள் சரிபார்க்க வேண்டும் என்று கற்பனை செய்து பாருங்கள்:

  1. SELECT balance FROM users WHERE id = 1;
  2. JS: இருப்பு < 50 என்றால், அவர்களைத் தடுக்கவும்!
  3. இல்லையெனில் செக் அவுட் தொடரவும்...
  4. கழிவை இயக்கவும்! (மேலும், படி 2 இல் காசோலையை சரிபார்க்கும் போது, ​​மற்றொரு இணையான ஒன்றை நீக்கிய ஒரு பயனரை இங்கே நீங்கள் காண்கிறீர்கள்.

புதுப்பித்தலுக்கு வெளிப்படையான பூட்டுதல்

ஒரு SELECT முடிவில் FOR UPDATE ஐச் சேர்ப்பது, அடுத்த COMMIT வரை மற்ற வாடிக்கையாளர்களுக்கு எதிராக உங்கள் அப்பாவி வாசிப்பை சீல் செய்யப்பட்ட பூட்டாக மாற்றும். குறிப்பிட்ட தேர்ந்தெடுக்கப்பட்ட வரிசைகளை என்ன செய்வது என்று நீங்கள் தீர்மானிக்கும் வரை, வேறு யாராலும் அப்டேட் செய்ய முடியாது (அல்லது ஒரே நேரத்தில் படிக்கும் புதுப்பிப்புக்காக)!

SQL
BEGIN;

-- If id=3 had already been locked by T1, T2 will sit in perpetual loading on this "read"
-- frozen in place, before receiving the raw data, until T1 runs COMMIT freeing everyone!
SELECT balance
FROM users
WHERE id = 3
FOR UPDATE;

-- at this point our Node JS instance lives with the guarantee, knowing for certain that NO ONE ELSE in the world has
-- manipulated (nor been able to read with intent to alter) that balance while we complete the application logic

UPDATE users SET balance = balance - 50 WHERE id = 3;

COMMIT;

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

நீங்களே முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#sql.m11.l3.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ஒரு சாதாரண நேர நோக்கமுள்ள பரிவர்த்தனையைத் திறந்து, தயாரிப்பு ஐடி=5ஐப் படிக்க பிரத்தியேகமாகப் பூட்டவும்.\nஇரண்டு-படி வினவலை இயக்கவும்:\n1. பரிவர்த்தனையைத் திறக்கவும் (BEGIN)\n2. 'புதுப்பிப்புக்காக' விருப்பத்தை இணைப்பதன் மூலம், ஐடி 5க்கான முழு வரிசையையும் யாரும் மாற்ற மாட்டார்கள் என்ற உத்தரவாதத்துடன் 'தயாரிப்புகளை' வினவவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

தொடக்கம்;, புதிய வரி, புதுப்பிப்புக்கு ஐடி = 5 ஐத் தேர்ந்தெடுக்கவும்;

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#sql.m11.l3.e2
முயற்சிகள்: 0ஏற்றுகிறது…

சில சமயங்களில் பரிவர்த்தனையானது பேரழிவுகரமான காலகட்டங்களுக்கு (முட்டுக்கட்டை அல்லது முடிவற்ற காத்திருப்பு) செயலிழக்கும்.\nஇதைத் தடுக்க, வரிசை உடனடியாக கிடைக்காத தருணத்தில் தரவுத்தளத்தை விட்டுவிடுமாறு நீங்கள் கட்டளையிடலாம்: இறுதியில் NOWAIT ஐப் பயன்படுத்தி, SQL சர்வர் விதிவிலக்கு JS க்கு மீண்டும் எழும்பச் செய்யும். NOWAIT ஐ அமல்படுத்துகிறது.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

இப்போது ஐடி = 1 ஐ புதுப்பிப்பதற்கு வகைகளில் இருந்து * தேர்ந்தெடுங்கள்;

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்