بچهها، شاید بپرسید وقتی دو تا درخواست تو یک نانوثانیه به دیتابیس میرسن، دیتابیس چطور جادو میکنه که همزمانی (Concurrency) پیش نمیاد؟ راز دیتابیس در دو کلمه خلاصه میشه: B-Tree Index و Latches
وقتی ما یک ستون رو یونیک میکنیم، دیتابیس تو پسزمینه یک ساختار درختی (B-Tree) براش میسازه. وقتی دو درخواست کاملاً همزمان میخوان یک کلید (مثلاً شماره تراکنش) رو تو این درخت ثبت (Insert) کنن، موتور دیتابیس (مثل InnoDB در MySQL) برای اینکه درختش به هم نریزه، از قفلهای بسیار سبک و فوقسریعی در سطح حافظه (RAM) استفاده میکنه که بهشون میگن Latch یا Mutex.
این قفلها اونقدر پایینرده هستن که مستقیماً با دستوراتِ سختافزاریِ CPU (مثل پردازشهای Compare-And-Swap) کار میکنن. یعنی در سطح فیزیکیِ پردازنده، محاله دو تا Thread بتونن همزمان یک خانه از حافظه رو تغییر بدن.
درخواست اول با اختلاف یک کلاکِ پردازنده (Clock Cycle) قفل (Latch) رو میگیره، کلید رو تو درختِ ایندکس مینویسه و قفل رو ول میکنه. درخواست دوم که پشت این گیتِ سختافزاری منتظر مونده بود، وقتی وارد میشه میبینه کلید همون یه لحظه پیش نوشته شده؛ پس عملیاتش رو لغو میکنه و خطای Duplicate Key میده!»
پس در نهایت اتمیک بودن در دیتابیس یک مفهوم بیشتر سخت افزاریه تا نرم افزاری خیلی اینو تو مصاحبه ها میبینم میپرسن ! به یادتون بسپارید لطفا
@codehalics | کدهالیک
Post #733
595
کدهالیک | codehalic چه راهی وجود داره که اسیر این داستان نشیم دقیقا متضاد این عمل رو انجام بدیم که بهش میگن Claim-Then-Act اول تصاحب کن، بعد انجام بده برای حل این مشکل، ما باید قانون بازی رو عوض کنیم. به جای اینکه فقط «نگاه کنیم»، باید تو همون نگاه اول صندلی رو «رزرو و قفل»…
- ❤ 3