ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 11 · 4లో పాఠం 3కోర్సులో 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లోడ్ అవుతోంది...

సాధారణ సమయ-పరిధి లావాదేవీని తెరిచి, ఉత్పత్తి ID=5 యొక్క రీడ్‌ను ప్రత్యేకంగా లాక్ చేయండి.\nరెండు-దశల ప్రశ్నను అమలు చేయండి:\n1. లావాదేవీని తెరవండి (BEGIN)\n2. 'అప్‌డేట్ కోసం' ఎంపికను జోడించడం ద్వారా, ఎవరూ మార్చరని హామీతో ID 5 కోసం పూర్తి అడ్డు వరుసను పొందుతున్న 'ప్రొడక్ట్‌లను' ప్రశ్నించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ప్రారంభం;, న్యూలైన్, అప్‌డేట్ కోసం ఎక్కడ ఐడి = 5 ఉన్న ఉత్పత్తుల నుండి * ఎంచుకోండి;

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#sql.m11.l3.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

కొన్నిసార్లు లావాదేవీ వినాశకరమైన కాలాల వరకు (డెడ్‌లాక్ లేదా అనంతమైన నిరీక్షణలు) ఆగిపోతుంది.\nదీన్ని నిరోధించడానికి, అడ్డు వరుస తక్షణమే అందుబాటులో లేని క్షణాన్ని వదిలివేయమని మీరు డేటాబేస్‌ను ఆదేశించవచ్చు: చివరలో NOWAITని ఉపయోగించడం, దీని వలన SQL సర్వర్ మినహాయింపు JSకి తిరిగి బౌన్స్ అయ్యేలా చేస్తుంది. NOWAITని అమలు చేస్తోంది.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఇప్పుడు ID = 1 అప్‌డేట్ కోసం వర్గాల నుండి * ఎంచుకోండి;

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది