MySQL SELECT FOR UPDATE පැහැදිලි කිරීම: පේළි අගුළු, NOWAIT, SKIP LOCKED, සහ හොඳම ක්‍රියාමාර්ග

目次

1. හැඳින්වීම

MySQL යනු ලොව පුරා පුළුල් ලෙස භාවිතා වන සම්බන්ධක දත්ත ගබඩා කළමනාකරණ පද්ධතියකි. එහි බොහෝ විශේෂාංග අතර, දත්ත අඛණ්ඩතාව රැක ගැනීම සහ එකවර යාවත්කාලීන කිරීම් මඟින් ඇතිවන ගැටළු වැළැක්වීම විශේෂයෙන් වැදගත් වේ. එකම දත්ත එකම වේලාවේ බහු පරිශීලකයන් හෝ පද්ධති ක්‍රියාත්මක කරන විට, අනිසි සමාන්තර පාලනයක් නිසා අනපේක්ෂිත දෝෂ හෝ දත්ත විනාශය සිදුවිය හැකිය.

මෙම ගැටළු සඳහා සාමාන්‍යතම විසඳුම SELECT … FOR UPDATE වේ. මෙම MySQL වාක්‍ය රචනය තෝරාගත් පේළි සඳහා අගුළු (අපරාධ පාලනය) යෙදේ. එය ඉන්වෙන්ටරි ආරක්ෂිතව අඩු කිරීම හෝ අනුපිළිවෙළ අංකයන් අනුපිළිවෙළින් ලබා දීම වැනි, නකල් නොවන සැබෑ ලෝක අවස්ථා වල බහුලව භාවිතා වේ.

මෙම ලිපියේ, SELECT … FOR UPDATE හි මූලික කරුණු සිට ප්‍රායෝගික භාවිතය, වැදගත් අවධානම්, සහ උසස් භාවිතා නඩු (උදාහරණ සහ නියැදි SQL කේත සමඟ) දක්වා සියල්ල පැහැදිලිව විස්තර කරමු.
ඔබගේ දත්ත ගබඩාව ආරක්ෂිතව හා කාර්යක්ෂමව ක්‍රියාත්මක කිරීමට, හෝ සමාන්තර පාලනය සඳහා හොඳම ක්‍රියා පටිපාටියන් ඉගෙන ගැනීමට කැමති නම්, අවසානය දක්වා කියවන්න.

2. SELECT FOR UPDATE හි මූලික කරුණු සහ පෙරඅවශ්‍යතා

SELECT … FOR UPDATE යනු MySQL හි තෝරාගත් පේළි සඳහා අගුළු (අපරාධ පාලනය) යෙදීමට භාවිතා කරන වාක්‍ය රචනයකි. බහු ක්‍රියාවලි හෝ පරිශීලකයන් එකම දත්ත එකම වේලාවේ සංස්කරණය කළ හැකි අවස්ථා වල මෙය ප්‍රධාන වශයෙන් භාවිතා වේ. මෙම කොටසේ, මෙම විශේෂාංගය ආරක්ෂිතව භාවිතා කිරීමට අවශ්‍ය මූලික සංකල්ප සහ පෙරඅවශ්‍යතා පැහැදිලි කරමු.

ප්‍රථමයෙන්, SELECT … FOR UPDATE කැපීම් (transaction) තුළ පමණක් ක්‍රියා කරයි. වෙනත් වචනයෙන් කියනවා නම්, ඔබ BEGIN හෝ START TRANSACTION භාවිතා කර කැපීම් ආරම්භ කර, එම පරාසය තුළ එය ක්‍රියාත්මක කළ යුතුය. කැපීම් පිටත භාවිතා කළහොත්, අගුළු ක්‍රියා නොකරයි.

එමෙන්ම, මෙම වාක්‍ය රචනය InnoDB ගබඩා එන්ජින් මගින් පමණක් සහය දක්වයි. MyISAM වැනි අනෙකුත් එන්ජින් මගින් එය සහය නොදේ. InnoDB ගබඩා එන්ජින් කැපීම් සහ පේළි-මට්ටමේ අගුළු වැනි උසස් විශේෂාංග ලබා දෙන බැවින්, සමාන්තර පාලනය සම්භවී වේ.

ඔබට ඉලක්ක වගුව හෝ පේළි සඳහා සුදුසු අවසර තිබිය යුතුය—සාමාන්‍යයෙන් SELECT සහ UPDATE අධිකාරි. අවශ්‍ය අවසර නොමැති නම්, අගුළු අසාර්ථක විය හැකි අතර දෝෂයක් පෙන්වනු ඇත.

සාරාංශය

  • SELECT … FOR UPDATE යනු කැපීම් තුළ පමණක් වලංගු වේ
  • InnoDB එන්ජින් භාවිතා කරන වගු සඳහා පමණක් අදාළ වේ
  • සුදුසු අවසර (SELECT සහ UPDATE) අවශ්‍ය වේ

මෙම පෙරඅවශ්‍යතා සපුරාලා නොමැති නම්, පේළි-මට්ටමේ අගුළු අපේක්ෂිත ලෙස ක්‍රියා නොකරයි. ඔබගේ SQL ප්‍රකාශන ලිවීමට පෙර මෙම ක්‍රියාකාරකම හොඳින් අවබෝධ කරගන්න.

3. එය කෙසේ ක්‍රියා කරයි: අගුළු පද්ධතියේ විස්තරය

ඔබ SELECT … FOR UPDATE භාවිතා කරන විට, MySQL තෝරාගත් පේළි සඳහා අපරාධ අගුළු (X lock) යෙදේ. අපරාධ අගුළු ඇති පේළි වෙනත් කැපීම් මගින් යාවත්කාලීන හෝ මකා දැමීමට නොහැකි වන අතර, ගැටළු සහ අසමත්තා වැළැක්වීමට උපකාරී වේ. මෙම කොටසේ, එය කෙසේ ක්‍රියා කරයි, ඇතුළත කුමක් සිදුවේද යන්න පැහැදිලිව විස්තර කරමු.

පේළි අගුළු වල මූලික හැසිරීම

SELECT … FOR UPDATE මගින් ලබාගත් පේළි වර්තමාන කැපීම් (COMMIT හෝ ROLLBACK) අවසන් වන තුරු වෙනත් කැපීම් මගින් යාවත්කාලීන හෝ මකා දැමීමට අවහිර වේ. උදාහරණයක් ලෙස, නිෂ්පාදන වගුවක ඉන්වෙන්ටරි අඩු කිරීමේදී, FOR UPDATE සමඟ ඉලක්ක පේළිය අගුළු කරන්නේ, ඒම ඉන්වෙන්ටරි වෙනත් ක්‍රියාවලි මගින් වෙනස් කිරීමට උත්සාහ කරන විට එය රැඳී සිටීමට ඉඩ දේ.

අනෙකුත් ගනුදෙනු සමඟ අන්තර්ක්‍රියා

පේළිය අගුළු කර ඇති අවස්ථාවේ, වෙනත් ගනුදෙනුවක් ඒම පේළිය යාවත්කාලීන හෝ මකා දැමීමට උත්සාහ කළහොත්, එම ක්‍රියාවලිය අගුළු මුදා හැරෙන තුරු කාලය ගත කරයි. එහෙත්, සාමාන්‍ය SELECT (කැමති කියවීම) ක්‍රියාකාරකම් තවමත් අවහිර නොවී ක්‍රියා කරයි. මෙම අගුළු පද්ධතියේ අරමුණ දත්ත අඛණ්ඩතාව රැක ගැනීම සහ ලියන ගැටළු වැළැක්වීම යන දෙකයි.

Gap අගුළු ගැන

InnoDB හි, gap lock ලෙස හැඳින්වෙන විශේෂ ලොක් වර්ගයක්ද ඇත. මෙය සෙවූ පේළිය නොමැති විට හෝ පරාස කොන්දේසියක් භාවිතා කරන විට, නියමිත පරාසයක නව දත්ත ඇතුළත් වීම වැලැක්වීමට භාවිතා වේ. උදාහරණයක් ලෙස, id = 5 FOR UPDATE සමඟ ලබා ගැනීමට උත්සාහ කරන විට පේළිය නොමැති නම්, InnoDB පාරිසරික ඉන්ඩෙක්ස් පරතරය ලොක් කරනු ඇත. මෙය තාවකාලිකව අනෙකුත් ගනුදෙනුකරුවන්ට එම පරාසයට නව රෙකෝඩ් ඇතුළත් කිරීම වැලැක්වයි.

ලොක් විස්තරය සහ කාර්ය සාධනය

පේළි-මට්ටමේ ලොක්‌වලට අවශ්‍ය අවම පරාසය පමණක් ලොක් කිරීමට නිර්මාණය කර ඇත, එය දත්ත සමගිත්වය රැක ගැනීමට සහ සමස්ත පද්ධති කාර්ය සාධනය වැදගත් ලෙස අඩු නොකරයි. එහෙත්, සෙවීමේ කොන්දේසි සංකීර්ණ නම් හෝ ඉන්ඩෙක්ස් නොමැති නම්, ලොක්‌වලින් අපේක්ෂිතයට වඩා විශාල පරාසයක් අහෝසි විය හැක. කාරුණික විමසුම් සැලසුම වැදගත් වේ.

4. විකල්ප තේරීම: NOWAIT සහ SKIP LOCKED

MySQL 8.0 සිට, SELECT … FOR UPDATE සමඟ NOWAIT සහ SKIP LOCKED වැනි අතිරේක විකල්ප භාවිතා කළ හැක. මෙම විකල්ප මගින් ලොක් ගැටළුවක් සිදුවූ විට පද්ධතියේ හැසිරීම පාලනය කළ හැක. එවගේම, ඒවායේ ලක්ෂණ සහ සුදුසු භාවිතා අවස්ථා පරීක්ෂා කරමු.

NOWAIT විකල්පය

NOWAIT නියම කර ඇති විට, වෙනත් ගනුදෙනුවක් ඉලක්ක පේළිය මත ලොක් කර තිබේ නම්, MySQL ඉක්මනින් දෝෂයක් ලබා දේ, රැඳී සිටීමක් නොකර.
මෙම හැසිරීම වේගවත් ප්‍රතිචාර අවශ්‍ය පද්ධති හෝ බ්‍යැච් ක්‍රියාවලීන්හි, රැඳී සිටීම වෙනුවට වහාම නැවත උත්සාහ කිරීමට අවශ්‍ය වන අවස්ථා සඳහා ප්‍රයෝජනවත් වේ.

SELECT * FROM orders WHERE id = 1 FOR UPDATE NOWAIT;

මෙම උදාහරණයේ, id = 1 පේළිය වෙනත් ගනුදෙනුවක් මගින් දැනට ලොක් කර තිබේ නම්, MySQL වහාම ලොක් ලබා ගැනීමේ දෝෂයක් ලබා දේ.

SKIP LOCKED විකල්පය

SKIP LOCKED දැනට ලොක් කර ඇති පේළි මඟ හැරී, ලොක් නොකළ පේළි පමණක් ලබා ගනී.
මෙය බහුල දත්ත සැකසීමේ හෝ පෝලිම්-මූලික වගු සැලසුම්හි, බහු ප්‍රකාර ක්‍රියාවලීන් එකවර කාර්යයන් කළමනාකරණය කරන අවස්ථා වල සාමාන්‍යයෙන් භාවිතා වේ. එය එක් එක් ක්‍රියාවලියට අනෙකුත් ක්‍රියාවලීන් රැඳී සිටීම නොමැතිව, ලබා ගත හැකි පේළි මත වැඩ කරගෙන යාමට ඉඩ සලසයි.

SELECT * FROM tasks WHERE status = 'pending' FOR UPDATE SKIP LOCKED;

මෙම උදාහරණයේ, status = 'pending' සහ දැනට ලොක් නොකළ පේළි පමණක් ලබා ගනී. මෙය බහු ක්‍රියාවලීන් අතර කාර්යක්ෂම සමකාලීන කාර්ය සැකසීම සක්‍රිය කරයි.

එක් එක් විකල්පය භාවිතා කිරීමේ අවස්ථා

  • NOWAIT : ඔබට වහාම සාර්ථක/අසාර්ථක ප්‍රතිචාර අවශ්‍ය වන අතර රැඳී සිටීම අනුමත නොකළ විට භාවිතා කරන්න.
  • SKIP LOCKED : ඔබට විශාල දත්ත කට්ටලයන් සමකාලීනව සැකසීමට අවශ්‍ය වන අතර ලොක් තරඟය අවම කර ගැනීමට අවශ්‍ය විට භාවිතා කරන්න.

ව්‍යාපාර අවශ්‍යතා අනුව සුදුසු විකල්පය තෝරා ගැනීමෙන්, ඔබට වඩා ලවච්ච සහ කාර්යක්ෂම සමකාලීන පාලනයක් ලබා ගත හැක.

5. ප්‍රායෝගික කේත උදාහරණ

මෙම කොටසේ, SELECT … FOR UPDATE භාවිතා කිරීම පිළිබඳ ප්‍රායෝගික SQL උදාහරණ සමඟ, සරල රටාවන් සිට සැබෑ ව්‍යාපාරික අවස්ථා දක්වා පැහැදිලි කරමු.

මූලික භාවිත රටාව

පළමුව, විශේෂ පේළියක් ආරක්ෂිතව යාවත්කාලීන කිරීම සඳහා සාමාන්‍ය රටාව මෙසේය.
උදාහරණයක් ලෙස, orders වගුවෙන් විශේෂ ඇණවුමක් ලබාගෙන, ඒ පේළිය ලොක් කර සමකාලීන වෙනස්කම් වලින් ආරක්ෂා කරයි.

උදාහරණය: විශේෂ ඇණවුමේ තත්ත්වය ආරක්ෂිතව යාවත්කාලීන කිරීම

START TRANSACTION;
SELECT * FROM orders WHERE id = 1 FOR UPDATE;
UPDATE orders SET status = 'processed' WHERE id = 1;
COMMIT;

මෙම ප්‍රවාහයේ, id = 1 පේළිය FOR UPDATE භාවිතයෙන් ලොක් කර ඇත, එම පේළිය එකවර වෙනත් ක්‍රියාවලීන් විසින් යාවත්කාලීන වීම වැලැක්වයි. අනෙකුත් ගනුදෙනුකරුවන් COMMIT හෝ ROLLBACK වන තෙක් එම පේළිය වෙනස් කිරීම හෝ මකා දැමීම සඳහා රැඳී සිටිය යුතුය.

උසස් උදාහරණය: අද්විතීය ගණකයක් ආරක්ෂිතව නිකුත් කිරීම

SELECT … FOR UPDATE විශේෂයෙන්ම අනුක්‍රමික අංක හෝ අනුක්‍රමික අගයන් ආරක්ෂිතව නිකුත් කිරීමේදී ප්‍රයෝජනවත් වේ.
උදාහරණයක් ලෙස, සාමාජිකත්ව අංක හෝ ඇණවුම් අංක ජනනය කිරීමේදී, බහු ක්‍රියාවලීන් එකම ගණකය ලබාගෙන වැඩි කරන විට ඇති විය හැකි තරඟ තත්ත්වයන් වැලැක්වයි.

උදාහරණය: අනුපිළිවෙළ අංකයක් පිළිවෙළින් නැවත නැවත නොකළ හැකි ලෙස නිකුත් කිරීම

START TRANSACTION;
SELECT serial_no FROM serial_numbers WHERE type = 'member' FOR UPDATE;
UPDATE serial_numbers SET serial_no = serial_no + 1 WHERE type = 'member';
COMMIT;

මෙම උදාහරණයේ, serial_numbers වගුවේ type = 'member' වන පේළිය අගුළු ලගා කර ඇත. වත්මන් අනුක්‍රමික අංකය ලබාගෙන, කැමති කිරීමේ පෙර වැඩි කරයි. එකම වේලාවේ බහු ක්‍රියාවලීන් ක්‍රියාත්මක වුවත්, අනුපිළිවෙළ අංකයන් අනුපිළිවෙළින් නැවත නොසිටින ලෙස ආරක්ෂා කරයි.

සටහන: FOR UPDATE සමඟ JOIN භාවිතය

FOR UPDATE, JOIN කොටස් සමඟ භාවිත කළ හැකි නමුත් ඔබට අවධානයෙන් සිටිය යුතුය. අගුළු අනිසි ලෙස අපේක්ෂිත පරාසයට වඩා පුළුල් පරාසයකට යෙදිය හැක. බොහෝ අවස්ථාවල, සරල SELECT ප්‍රකාශයක් භාවිතා කර ඔබ යාවත්කාලීන කිරීමට අදහස් කරන වගුවේ නියම පේළි පමණක් අගුළු ලගා කිරීම වඩා ආරක්ෂිත වේ.

ඉහත පෙන්වා ඇති පරිදි, SELECT … FOR UPDATE සරල යාවත්කාලීන කිරීම් සඳහාත්, අනුක්‍රමික අංක ජනනය වැනි ප්‍රායෝගික අවස්ථා සඳහාත් යොදා ගත හැක. ඔබේ පද්ධති සැලසුම අනුව සුදුසු ක්‍රියාත්මක කිරීම තෝරන්න.

6. පාලන අගුළු (Gap Locks) සහ ඝාතන අගුළු (Deadlocks): අවදානම් සහ ප්‍රතිකාර

SELECT … FOR UPDATE ශක්තිමත් සමකාලීන පාලන ක්‍රමයක් වුවත්, InnoDB එන්ජින් පාලන අගුළු (gap locks) සහ ඝාතන අගුළු (deadlocks) වැනි විශේෂ හැසිරීම් අඩංගු කර ඇත, ඒවාට අවධානයෙන් යොමු විය යුතුය. මෙම කොටස මෙම යන්ත්‍රණයන් සහ මෙහෙයුම් ගැටළු වැළැක්වීමේ ක්‍රම විස්තර කරයි.

පාලන අගුළු (Gap Lock) හැසිරීම සහ අවධානම්

සෙවූ පේළිය නොමැති වීමේදී හෝ පරාස කොන්දේසියක් භාවිතා කරන විට පාලන අගුළු (gap lock) සිදුවේ. අගුළු ගැලපෙන පේළි පමණක් නොව, අවට ඉන්ඩෙක්ස් පරාසය (gap) වෙතද යෙදේ. උදාහරණයක් ලෙස, ඔබ SELECT * FROM users WHERE id = 10 FOR UPDATE; ක්‍රියාත්මක කර, id = 10 පේළිය නොමැති නම්, InnoDB අසල පාලන අගුළු යොදයි, එම පරාසයේ INSERT ක්‍රියාකාරකම් තාවකාලිකව තහනම් කරයි.

පාලන අගුළු (gap locks) අනුපිළිවෙළ ලියාපදිංචි කිරීම හෝ ඒකකත්ව උල්ලංඝනය වැනි ගැටළු වැළැක්වීමට උපකාරී වේ. නමුත්, ඒවා අපේක්ෂිතයට වඩා පුළුල් අගුළු ලගා කර, INSERT ක්‍රියාකාරකම් අවහිර කරනු ඇත. අනුක්‍රමික ID හෝ පරාස සෙවීම් බහුලව භාවිතා කරන පද්ධති සඳහා විශේෂ අවධානය අවශ්‍ය වේ.

ඝාතන අගුළු (Deadlocks) සහ ඒවා වැළැක්වීමේ ක්‍රම

ඝාතන අගුළු (deadlock) බහු ගනුදෙනු එකිනෙකාගේ අගුළු සඳහා රැඳී සිටින විට සිදුවේ, එමඟින් සියලු ගනුදෙනු ඉදිරියට යාම අසීරු වේ. InnoDB හි, ඝාතන අගුළු හඳුනාගත් විට, එක් ගනුදෙනුවක් ස්වයංක්‍රීයව පසුපසට හැරේ. නමුත්, ඔබේ පද්ධතිය ඝාතන අගුළු අවම කර도록 සැලසුම් කිරීම සුදුසුය.

ඝාතන අගුළු වැළැක්වීමට ප්‍රධාන උපාය මාර්ග:

  • අගුළු ලබා ගැනීමේ ක්‍රමය සම්මත කිරීම ගනුදෙනුවක් තුළ බහු වගු හෝ පේළි අගුළු ලගා කරන්නේ නම්, සියලු ක්‍රියාවලීන් තුළ ඒවා එකම ක්‍රමයෙන් ප්‍රවේශ වීමෙන් ඝාතන අගුළු අවදානම ගණනාවට අඩු කරයි.
  • ගනුදෙනු කෙටි තබා ගැනීම ගනුදෙනුව තුළ කරන වැඩ ප්‍රමාණය සීමා කර, අනිවාර්ය නොවන රැඳී සිටීමෙන් වැළැක්වන්න.
  • සංකීර්ණ JOIN විමසුම් වලදී අවධානයෙන් සිටීම LEFT JOIN හෝ බහු-වගු අගුළු අනිසි ලෙස අගුළු පරාසය පුළුල් කරයි. SQL ප්‍රකාශන සරලව තබා, අවශ්‍ය විට අගුළු තර්කය වෙන් කර තබන්න.

JOIN සමඟ එකතු කිරීමේ අවදානම්

SELECT … FOR UPDATE සමඟ JOIN භාවිතා කරන විට, අගුළු ප්‍රධාන වගුවට පසු වඩා පරාසයට පැතිරිය හැක. උදාහරණයක් ලෙස, ඔබ orders සහ customers වගු JOIN කර FOR UPDATE භාවිතා කළහොත්, දෙකම වගු වල පේළි අනිසි ලෙස අගුළු ලගා විය හැක. අධික අගුළු ලගා කිරීම වැළැක්වීමට, ඔබට අවශ්‍ය නියම වගුව සහ පේළි පමණක් වෙනම SELECT ප්‍රකාශන භාවිතා කර අගුළු ලගා කිරීම සුදුසු වේ.

MySQL හි අගුළු යන්ත්‍රණය සුක්ෂ්ම දෝෂයන් අඩංගු වේ. පාලන අගුළු (gap locks) සහ ඝාතන අගුළු (deadlocks) පිළිබඳ නිවැරදි අවබෝධය ස්ථාවර සහ විශ්වාසනීය පද්ධති ගොඩනැගීමට අත්‍යවශ්‍ය වේ.

7. අධිකාරී අගුළු (Pessimistic Locking) vs ආශාවාදී අගුළු (Optimistic Locking)

දත්ත ගබඩා වල සමකාලීන පාලනය සඳහා ප්‍රධාන දෙකක් ඇත: අධිකාරී අගුළු (pessimistic locking) සහ ආශාවාදී අගුළු (optimistic locking). SELECT … FOR UPDATE අධිකාරී අගුළුගේ සාමාන්‍ය උදාහරණයකි. වාස්තුක පද්ධතිවල, තත්ත්වය අනුව නිවැරදි පරිදි තේරීම වැදගත් වේ. මෙම කොටස එක් එක් අගුළු වර්ගයේ ලක්ෂණ සහ තේරීම් මාර්ගෝපදේශය පැහැදිලි කරයි.

අධිකාරී අගුළු (Pessimistic Locking) යනු කුමක්ද?

Pessimistic Locking අනෙක් ගනුදෙනුකරුන් එකම දත්ත වෙනස් කිරීමට ඉඩ ඇති බව අනුමාන කරයි, එබැවින් ප්‍රවේශය ලබා ගත් විට දත්ත පෙර ලොක් කරයි.
SELECT … FOR UPDATE භාවිතා කිරීමෙන්, යාවත්කාලීන කිරීමක් සිදු කිරීමට පෙර ලොක් එකක් යෙදේ, ඒ මඟින් සමකාලීන ගනුදෙනුකරුන් නිර්මාණය කරන ගැටලු හෝ අසමතුලිතතා වැළැක්විය හැක. මෙම ක්‍රමය ගැටලු බහුලව සිදුවන හෝ දැඩි දත්ත අඛණ්ඩතාවය අත්‍යවශ්‍ය වන පරිසරවල ප්‍රයෝජනවත් වේ.

Common Use Cases:

  • ඉන්වෙන්ටරි කළමනාකරණය සහ ශේෂ ප්‍රකාරණය
  • අනුපිළිවෙළ අංක හෝ අනුක්‍රමික අංක නකල් කිරීම වැළැක්වීම
  • සමකාලීන බහු-පරිශීලක සංස්කරණය කරන පද්ධති

What Is Optimistic Locking?

Optimistic Locking ගැටලු අඩුයැයි අනුමාන කරයි සහ ලබා ගැනීමේදී දත්ත ලොක් නොකරයි.
යාවත්කාලීන කිරීමේදී, එය සංස්කරණ අංකයක් හෝ කාල සටහනක් පරීක්ෂා කර දත්ත වෙනස් වී නැතැයි තහවුරු කරයි. වෙනත් ගනුදෙනුවක් එය වෙනස් කර ඇත්නම්, යාවත්කාලීන කිරීම අසාර්ථක වේ.

Common Use Cases:

  • බහුලව කියවීම් සිදු වන අතර සමකාලීන ලිවීම් අඩු පද්ධති
  • පරිශීලකයන් සාමාන්‍යයෙන් ස්වාධීනව ක්‍රියා කරන යෙදුම්

Example of Optimistic Lock Implementation:

-- Store the version number when retrieving data
SELECT id, value, version FROM items WHERE id = 1;

-- Update only if the version has not changed
UPDATE items SET value = 'new', version = version + 1 
WHERE id = 1 AND version = 2;
-- If another transaction already updated the version,
-- this UPDATE statement will fail

How to Choose Between Them

  • Pessimistic Locking : ගැටලු බහුලව සිදුවන හෝ දත්ත අඛණ්ඩතාවය අතිශය වැදගත් වන විට භාවිතා කරන්න.
  • Optimistic Locking : ගැටලු අඩු වන අතර කාර්ය සාධනය ප්‍රමුඛ්‍යතාවය දක්වන විට භාවිතා කරන්න.

ප්‍රායෝගිකව, පද්ධති බොහෝ විට මෙවලම් දෙකම භාවිතා කරයි, මෙහෙයුම අනුව. උදාහරණයක් ලෙස, ඇණවුම් සැකසීම හෝ ඉන්වෙන්ටරි වෙන් කිරීම සාමාන්‍යයෙන් පෙසිමස්ටික් ලොකින් භාවිතා කරන අතර, පැතිකඩ යාවත්කාලීන කිරීම හෝ වින්‍යාස වෙනස් කිරීම ඔප්ටිමස්ටික් ලොකින් භාවිතා කරයි.

පෙසිමස්ටික් සහ ඔප්ටිමස්ටික් ලොකින් අතර වෙනස තේරුම් ගැනීමෙන් ඔබේ යෙදුම සඳහා සුදුසු සමකාලීන පාලනยุත්‍රය තෝරා ගැනීමට හැකියාව ලැබේ.

8. Performance Considerations

SELECT … FOR UPDATE ශක්තිමත් සමකාලීන පාලනය ලබා දේ, නමුත් අනිසි භාවිතය පද්ධතියේ සමස්ත කාර්ය සාධනයට නරක බලපෑම් ඇති කරයි. මෙම කොටස ප්‍රධාන කාර්ය සාධන සැලකිලි සහ පොදු වැරදි පිළිබඳ විස්තර කරයි.

Table-Level Locking Due to Missing Indexes

SELECT … FOR UPDATE පේළි-මට්ටමේ ලොකින් සඳහා නිර්මාණය කර තිබුණද, සෙවීමේ කොන්දේසිය සඳහා සුදුසු දර්ශකයක් නොමැති නම්—හෝ කොන්දේසිය අස්පෂ්ට නම්—MySQL ප්‍රායෝගිකව වගුවේ විශාල කොටසක් ලොක් කරයි.
උදාහරණයක් ලෙස, දර්ශක නොකළ තීරුවකට WHERE වාක්‍යයක් භාවිතා කිරීම හෝ අකාරාත්මක පේටර්න (උදා. ආරම්භයේ වයිල්ඩ්කාඩ් LIKE සෙවීම්) භාවිතා කිරීම MySQLට නිරවද්‍ය පේළි ලොක් යෙදීමට නොහැකි කරයි, එමඟින් පුළුල් ලොකින් සිදු වේ.

මෙය අනෙක් ගනුදෙනුකරුන්ට අනිවාර්යයෙන්ම රැඳී සිටීමට හේතු විය හැකි අතර, ප්‍රතිචාර වේගය අඩුවීම සහ ඩෙඩ්ලොක් සංඛ්‍යාව වැඩිවීම සිදු වේ.

Avoid Long-Running Transactions

SELECT … FOR UPDATE මගින් ලොක් එකක් දිගු කාලයක් තබා ගත් පසු, අනෙක් පරිශීලකයන් සහ පද්ධති ඒ ලොක් මුදා හැරෙන තුරු රැඳී සිටිය යුතු වේ.
මෙය බොහෝ විට යෙදුම් නිර්මාණයේ වැරදි නිසා සිදුවේ, උදා. ලොක් තබා තබා පරිශීලක ඉන්පුට් බලා සිටීම, එය පද්ධතියේ කාර්ය සාධනය බරපතල ලෙස අඩු කරයි.

Main Countermeasures:

  • ලොක් කරන පරාසය අවම කරන්න (WHERE කොන්දේසි හොඳින් සකස් කර සුදුසු දර්ශක භාවිතා කරන්න)
  • ගනුදෙනු කාලය හැකි තරම් කෙටි කරගන්න (පරිශීලක අන්තර්ක්‍රියා හෝ අනිවාර්ය නොවන සැකසීම් ගනුදෙනු පිටතට ගෙන යන්න)
  • අසාමාන්‍ය දිගු කාලීන ලොක් වලින් වැළැක්වීමට කාල සීමා සහ නිසි εξαίρεση (exception) සැකසීම ක්‍රියාත්මක කරන්න

Retry Handling for Lock Conflicts

ඉහළ ගමන් තදබද පද්ධති හෝ බහුතර බාච් සැකසීම් පරිසරවල, ලොක් ගැටලු සහ රැඳී සිටීමේ දෝෂයන් බහුලව සිදුවේ.
එවැනි අවස්ථාවල, ලොක් ලබා ගැනීම අසාර්ථක වූ විට ප්‍රතිඵලය (retry) තර්කය ක්‍රියාත්මක කිරීම, සහ අවශ්‍ය නම් NOWAIT හෝ SKIP LOCKED භාවිතා කිරීම සලකා බලන්න.

අධිෂ්ඨානාත්මක ක්‍රියාකාරීත්වය සැලසුම්කරණයකින් තොරව, හොඳින් සැලසුම් කළ සමකාලීනතා පාලනයක් පවා සැකසුම් ප්‍රමාදයන් හෝ පද්ධති බෝතල්නෙකුගේ ප්‍රතිඵලයක් බවට පත්විය හැක. සැලසුම් අදියරේ සිටම, ස්ථාවර පද්ධති ක්‍රියාකාරීත්වය සහතික කිරීම සඳහා, ලොක් හැසිරීම සහ ක්‍රියාකාරීත්වයට ඇති බලපෑම දෙකම සැලකිල්ලට ගන්න.

9. FAQ (පොදු ප්‍රශ්න)

මෙම කොටස SELECT … FOR UPDATE සම්බන්ධ පොදු ප්‍රශ්න සහ ප්‍රායෝගික ගැටලු Q&A ආකෘතියකින් සාරාංශගත කරයි. මෙම නිතර අපහසුතාවට ලක්වන කරුණු තේරුම් ගැනීමෙන්, ඔබට යථාර්ථයේ ක්‍රියාත්මක කිරීම්වලදී පොදු ගැටලු වළක්වා ගැනීමට හැකි වේ.

Q1. SELECT … FOR UPDATE සක්‍රිය වන විට වෙනත් සැසිවලට එකම පේළිය SELECT කළ හැකිද?

A. ඔව්. SELECT … FOR UPDATE මගින් යෙදෙන ලොක් එකක් යාවත්කාලීන කිරීම් සහ මකා දැමීම් ක්‍රියාවලියට පමණක් බලපායි. සාමාන්‍ය SELECT (කියවීම් පමණක්) විමසීම් වෙනත් සැසිවලින් පේළිය ලබා ගැනීමට තවමත් හැකි වන අතර, බාධාවකින් තොරව.

Q2. FOR UPDATE සමඟ නොමැති පේළියක් SELECT කිරීමට උත්සාහ කළහොත් කුමක් සිදුවේද?

A. එවැනි අවස්ථාවකදී, InnoDB හෝ සෙවූ පරාසයක gap lock එකක් යෙදිය හැක. මෙය වෙනත් ගනුදෙනුවලින් එම පරාසයට INSERT ක්‍රියාවලි තහනම් කරයි. මෙය නව වාර්තා ඇතුළත් කිරීම අනපේක්ෂිතව බාධා කළ හැකි බැවින්, සැලකිලිමත් වන්න.

Q3. LEFT JOIN වැනි JOIN කොටස් සමඟ FOR UPDATE භාවිතා කිරීම ආරක්ෂිතද?

A. සාමාන්‍යයෙන්, එය නිර්දේශ නොකෙරේ. JOIN භාවිතා කිරීමෙන් ලොක් පරාසය අනපේක්ෂිතව බහු පිඨාපිටියන්ට හෝ අනපේක්ෂිතව වැඩි පේළිවලට ව්‍යාප්ත විය හැක. නිවැරදි ලොකිං අවශ්‍ය නම්, අවශ්‍ය පිඨාපිටිය සහ පේළි පමණක් ලොක් කිරීම සඳහා සරල SELECT එකක් භාවිතා කරන්න.

Q4. NOWAIT සහ SKIP LOCKED අතර තේරීම කළ යුත්තේ කෙසේද?

A. NOWAIT ලොක් ලබා ගත නොහැකි නම් වහාම දෝෂයක් ආපසු එවයි. SKIP LOCKED ලොක් නොකළ පේළි පමණක් ලබා ගනී. වහාම සාර්ථකත්වය/බැරිවීමේ ප්‍රතිඵල අවශ්‍ය නම් NOWAIT තෝරන්න. සමාන්තරව විශාල දත්ත සෙට් පැකේජ් කිරීමේදී SKIP LOCKED තෝරන්න.

Q5. බලාපොරොත්තු සහගත ලොකිං වඩාත් සුදුසු වන්නේ කවදාද?

A. බලාපොරොත්තු සහගත ලොකිං ගැටුම් දුර්ලභ වන විට හෝ ඉහළ throughput අවශ්‍ය වන විට ඵලදායී වේ. ගැටුම් නිතර සිදුවන විට හෝ දැඩි දත්ත අඛණ්ඩතාව අත්‍යවශ්‍ය වන විට (FOR UPDATE) පරාභූතික ලොකිං භාවිතා කළ යුතුය.

මෙම පොදු ප්‍රශ්න ඉදිරියට විසඳීමෙන්, ඔබට ඔබේ පද්ධති සැලසුම්කරණයේ විශ්වාසනීයත්වය සහ ප්‍රායෝගික වටිනාකම සහ ගැටලු විසඳීමේ ක්‍රියාවලිය වැඩිදියුණු කළ හැක.

10. නිගමනය

SELECT … FOR UPDATE MySQL හි බලවත්ම සහ නම්‍යශීලී සමකාලීනතා පාලන යාන්ත්‍රණවලින් එකක් වේ. බහු පරිශීලකයින් හෝ ක්‍රියාවලින් එකම දත්තවලට සමකාලීනව ප්‍රවේශ වන පද්ධතිවලදී, දත්ත අඛණ්ඩතාව සහ ආරක්ෂාව පවත්වා ගැනීමේදී එය තීරණාත්මක භූමිකාවක් ඉටු කරයි.

මෙම ලිපිය මූලික සංකල්ප, ප්‍රායෝගික භාවිතය, ලබා ගත හැකි විකල්ප, උසස් තත්ත්වයන්, gap locks, deadlocks, පරාභූතික vs බලාපොරොත්තු සහගත ලොකිං, සහ ක්‍රියාකාරීත්ව සැලකිල්ලන් ආවරණය කළේය. මෙම තීක්ෂ්ණ බුද්ධිය යථාර්ථයේ පරිසරවල දෛනික ක්‍රියාකාරකම් සහ ගැටලු විසඳීම සඳහා වටිනා වේ.

ප්‍රධාන ඉගෙනීම්:

  • SELECT … FOR UPDATE ගනුදෙනුවක් තුළ පමණක් ක්‍රියා කරයි
  • පේළි- මට්ටම් ලොකිං සමකාලීන යාවත්කාලීන කිරීම් සහ දත්ත ගැටුම් වළක්වයි
  • JOIN සමඟ gap locks සහ ලොක් ව්‍යාප්තිය වැනි MySQL- විශේෂ හැසිරීම් පිළිබඳව සැලකිලිමත් වන්න
  • NOWAIT සහ SKIP LOCKED වැනි විකල්ප නිවැරදිව භාවිතා කරන්න
  • පරාභූතික සහ බලාපොරොත්තු සහගත ලොකිං අතර වෙනස තේරුම් ගන්න
  • නිවැරදි සුචිකරණය, ගනුදෙනු කළමනාකරණය, සහ ක්‍රියාකාරීත්ව සැලසුම්කරණය අත්‍යවශ්‍ය වේ

SELECT … FOR UPDATE ඉතා උපකාරී වුවද, එහි හැසිරීම හෝ අතුරු ආචරණ අපහසුතාවට ලක්වීමෙන් අනපේක්ෂිත ගැටලු ඇති විය හැක. ඔබේ ලොකිං උපාය මාර්ගය සැමවිටම ඔබේ පද්ධති සැලසුම්කරණය සහ ක්‍රියාකාරීත්ව ඉලක්ක සමඟ ගලපන්න.
ඔබ උසස් දත්ත සමුදාය පද්ධති හෝ යෙදුම් ගොඩනැගීමට අපේක්ෂා කරන්නේ නම්, මෙහි විස්තර කළ සංකල්ප භාවිතා කරමින් ඔබේ පරිසරයට වඩාත් සුදුසු සමකාලීනතා පාලන උපාය මාර්ගය තෝරන්න.