ویژگی SKIP LOCKED یکی از امکانات کاربردی جدید تو دیتابیس MariaDB هست که از روی MySQL کپی گرفته شده. با استفاده از این قابلیت، تو عملیات SELECT یا UPDATE میتونیم ردیفهایی که قفل شدن رو نادیده بگیریم. این ویژگی بهخصوص برای برنامههایی که منابع محدودی مثل اجاره اقامتگاه، صندلیهای پرواز یا بلیطهای کنسرت رو رزرو میکنن خیلی مفیده.
سیستم رزرو اقامتگاه رو تصور کنین. وقتی یه کاربر داره اتاقی رو رزرو میکنه، ممکنه همزمان چند کاربر دیگه هم درخواست بدن و اون اتاق قفل بشه (یعنی موقتاً رزرو بشه). اگه بخوای بدون این که معطل کاربر اول بشی، سریعاً بری سراغ اتاقهای دیگه و اونایی که قفل نیستن رو به کاربر پیشنهاد بدی، SKIP LOCKED دقیقاً همین کارو برات انجام میده.
حالا توی یه مثال واقعی فرض کنید ما یه جدول به اسم rooms داریم که اطلاعات اقامتگاه توشه. وقتی بخوایم یه اتاق آزاد پیدا کنیم و رزرو کنیم، دستورمون به این شکل میشه:
SELECT * FROM rooms WHERE status = 'available' FOR UPDATE SKIP LOCKED;
این دستور، فقط اتاقهایی که آزاد و بدون قفل هستن رو برمیگردونه و اتاقهای قفل شده رو رد میکنه، بدون این که منتظر بمونه قفل باز شه.
این ویژگی برای اپلیکیشنهایی که باید سریع عمل کنن و منتظر آزاد شدن ردیفهای قفل نباشن، فوقالعاده مفیده. مثلاً توی فروش بلیط کنسرت وقتی چند نفر همزمان میخوان صندلی انتخاب کنن، باید سریع بتونی بلیطهای در دسترس رو به بقیه نمایش بدی.وقتی از SKIP LOCKED استفاده میکنی، دیتابیس به صورت خودکار رکوردهایی که قفل شدن رو نادیده میگیره. با این روش، همزمانی رو مدیریت میکنیم و از ایجاد Deadlock (یعنی حالتی که دو تراکنش منتظر همدیگه بمونن و هیچکدوم نتونن پیش برن) جلوگیری میکنیم.
اما بریم ببینیم Under the hood چه خبره؟
دیتابیسها از مکانیزمهای قفلگذاری برای اطمینان از data consistency در شرایط رقابتی استفاده میکنن.دو نوع قفلگذاری اصلی داریم shared locks & exclusive locks بریم ببینیم هرکدومشون برای چه سناریو هایی مناسب هستن.
قفل گذاری اشتراکی برای عملیات SELECT اعمال میشه و اجازه میده چندین کاربر همزمان دیتا رو بخونن.
قفل اختصاصی تو عملیاتهایی مثل UPDATE و DELETE استفاده میشه و فقط یک کاربر اجازه تغییرات داره.
وقتی ردیفی قفل میشه، اگر دسترسی همزمان دیگهای بخواد اون ردیف رو تغییر بده، درخواست اون دسترسی تا وقتی که قفل باز شه معلق میمونه. اما با SKIP LOCKED، دیتابیس اون ردیفهای قفل شده رو رد میکنه و رکوردهای بدون قفل رو در اختیار قرار میده، بدون اینکه نیاز باشه منتظر آزاد شدن قفلها بمونی.