پرش به مطلب اصلی

Livelock

لایولاک شبیه DeadLock هست، ولی با یه تفاوت مهم:

  • ددلاک: دو یا چند پردازش گیر می‌افتن و هیچ‌کدوم دیگه حرکت نمی‌کنن.
  • لایولاک: پردازش‌ها گیر می‌افتن، ولی همچنان دارن کارهایی انجام می‌دن که هیچ‌وقت به نتیجه نمی‌رسه!

یه مثال ساده از لایولاک:

فرض کن دوتا نفر دارن توی یه راهروی باریک از روبه‌رو میان. هر دو همزمان می‌رن سمت راست تا راه رو باز کنن، ولی بازم جلوی هم هستن. بعد دوباره می‌رن سمت چپ، بازم جلوی هم گیر می‌کنن! این حرکتشون هی تکرار می‌شه و هیچ‌وقت عبور نمی‌کنن! 😅

💡 پس توی لایولاک، پروسه‌ها به جای متوقف شدن (مثل ددلاک)، الکی در حال تغییر و تلاش هستن، ولی هیچ‌وقت پیشرفت واقعی ندارن.


لایولاک در دیتابیس:

مثلاً توی یه سیستم رزرو بلیط:

  1. دو تراکنش هم‌زمان شروع می‌شن و می‌خوان یه بلیط رو بگیرن.
  2. هر دو تراکنش متوجه می‌شن که یه قفل روی ردیف هست و به خاطر سیاست دیتابیس، به جای منتظر موندن، دوباره سعی می‌کنن.
  3. این فرآیند بارها تکرار می‌شه، چون هر دفعه یکی از تراکنش‌ها تغییر وضعیت می‌ده.
  4. در نهایت، هیچ‌کدوم موفق به گرفتن قفل نمی‌شن و یه جور "چرخش بی‌پایان" ایجاد می‌شه.

چطور جلوی لایولاک رو بگیریم؟

ترتیب قفل‌گیری رو کنترل کنیم تا پردازش‌ها تکراری نش ن.
از backoff (مکث تصادفی بین تلاش‌ها) استفاده کنیم تا پردازش‌ها همزمان واکنش نشون ندن.
از timeout (محدودیت زمانی) استفاده کنیم تا تراکنش‌ها بعد از چند بار تلاش متوقف بشن.

👀 پس لایولاک باعث توقف کامل سیستم نمی‌شه، ولی کار رو بی‌نتیجه نگه می‌داره!