سلام دوستان. امروز میخواهیم در مورد یک موضوع مهم در پایگاه داده صحبت کنیم: تداخل همزمان. شاید این اصطلاح کمی ترسناک به نظر برسد، اما نگران نباشید، سعی میکنم خیلی ساده توضیح بدم.
تصور کنید یک فروشگاه آنلاین دارید. همزمان، چندین نفر (کاربر) دارند محصولات را میخرند، اطلاعات را بروزرسانی میکنند و سفارش ثبت میکنند. پایگاه داده شما باید بتواند همه این درخواست ها را به طور همزمان و بدون ایجاد مشکل یا خطا مدیریت کند. اینجاست که "تداخل همزمان" (Concurrency) وارد عمل میشود. اگر پایگاه داده شما نتواند همزمانی را به خوبی مدیریت کند، ممکن است اطلاعات خراب شوند، سفارشات اشتباه ثبت شوند، یا کاربران مجبور شوند زمان زیادی منتظر بمانند. بد میشه، نه؟
به زبان ساده، تداخل همزمان یعنی اینکه چندین تراکنش (Transaction) به طور همزمان در حال دسترسی و تغییر اطلاعات در پایگاه داده هستند. یک تراکنش میتواند یک عملیات ساده مثل خواندن یک رکورد باشد، یا یک عملیات پیچیده تر مثل ثبت سفارش و پرداخت آنلاین.
مشکل زمانی پیش میاد که این تراکنش ها با هم تداخل پیدا کنند. مثلا، دو نفر همزمان سعی کنند موجودی یک محصول را کم کنند. اگر این کار به درستی مدیریت نشود، ممکن است موجودی منفی شود! (فرض کنیم فقط یک عدد از آن محصول باقی مانده باشد، هر دو تراکنش آن را بخوانند، و هر دو تراکنش آن را کم کنند. نتیجه: موجودی -1!)
چند دلیل اصلی وجود دارد که تداخل همزمان باعث ایجاد مشکل می شود:
خوشبختانه، پایگاه داده ها روش های مختلفی برای مدیریت تداخل همزمان دارند. این روش ها معمولا بر اساس مفهوم "قفل گذاری" (Locking) کار میکنند. یعنی یک تراکنش قبل از دسترسی به یک داده، روی آن "قفل" میگذارد. تراکنش های دیگر نمیتوانند به آن داده دسترسی پیدا کنند تا زمانی که قفل برداشته شود.
انواع مختلفی از قفل وجود دارد:
پایگاه داده ها همچنین از روش های دیگری مانند "مهر زمانی" (Timestamping) و "کنترل همزمانی خوش بینانه" (Optimistic Concurrency Control) استفاده میکنند.
فرض کنیم جدولی داریم به نام accounts
که موجودی حساب های بانکی را نگهداری می کند:
account_id | balance |
---|---|
1 | 1000 |
2 | 500 |
حالا دو تراکنش داریم. تراکنش اول میخواهد 100 تومان از حساب شماره 1 برداشت کند، و تراکنش دوم میخواهد 200 تومان به حساب شماره 2 واریز کند.
تراکنش اول:
START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 1; -- مقدار balance = 1000
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; -- مقدار balance را به 900 تغییر بده
COMMIT;
تراکنش دوم:
START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 2; -- مقدار balance = 500
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2; -- مقدار balance را به 700 تغییر بده
COMMIT;
اگر این دو تراکنش همزمان اجرا شوند، پایگاه داده باید اطمینان حاصل کند که هیچ کدام از این مشکلات بالا (از دست رفتن بروزرسانی، خواندن داده های کثیف و غیره) رخ ندهد. معمولا پایگاه داده از قفل گذاری استفاده میکند تا مطمئن شود که هر تراکنش به طور ایزوله (Isolated) کار میکند و تغییرات آن به درستی اعمال میشوند.
تداخل همزمان یک چالش مهم در طراحی و مدیریت پایگاه داده ها است. پایگاه داده ها از روش های مختلفی مانند قفل گذاری، مهر زمانی، و کنترل همزمانی خوش بینانه برای مدیریت این تداخلات و حفظ یکپارچگی داده ها استفاده میکنند. اگر شما یک توسعه دهنده وب، یک مدیر پایگاه داده، یا فقط یک فرد علاقه مند به فناوری هستید، درک مفهوم تداخل همزمان برای شما مفید خواهد بود.
امیدوارم این مطلب برای شما مفید بوده باشد. اگه سوالی داشتید در قسمت نظرات بپرسید. در ضممن به نکتا خیلی مهم دقت کنید.
پایگاه داده، تداخل همزمان، Transaction، قفل گذاری، Database، Concurrency، Locking، Lost Update، Dirty Read، SQL.
امتیاز شما به این مطلب
امتیاز: 5 از 5 (مجموع 1 رای)
اولین نفری باشید که در مورد این مقاله نظر می دهید!
techfeed.ir© 2024 All rights reserved